2014-12-11 2 views
4

그럼 내가하고자하는 것은 findOne이 유성에서와 비슷하게 작동하지만 Mongo 셸을 사용하는 것입니다. 간단히 말해서 나는이 db.collection.findOne("thisIsAnId")과 같은 것을 할 수 있고 그 컬렉션에서 그 id를 찾을 수 있기를 원한다. Mongodb의 기본 기능을 재정의하는 방법이 있습니까?

나는 그것을이가있는 파일을 ...로드 시도 originalFindOne 기본 findOne 단지 체인이 전혀 작동하지 않았다 것
db.collection.findOne = function(query, fields, options){ 
    if(typeof query === "string") { 
     return db.collection.originalFindOne({_id : query}, fields, options); 
    } 

    return db.collection.originalFindOne(query, fields, options); 
} 

. 그래서 운이 없으면 기본 함수를 재정의 할 방법을 찾은 후 db.collection.simpleFindOne() 또는 뭔가와 같은 새로운 함수를 만들 수 있다고 생각했지만 몽고 셸에 연결할 수있는 방법을 찾을 수 없으므로 모든 함수에서 사용할 수 있습니다. 수집.

누구나 몽고 내부 구조가 어떤 도움을 줄 수 있는지에 대한 통찰력이 있습니까? 당신의 몽고 설정 파일 중 하나에이 코드를 추가

답변

4

시도 :

(function() { 

// Duck-punch Mongo's `findOne` to work like Meteor's `findOne` 
if (
    typeof DBCollection !== "undefined" && DBCollection && 
    DBCollection.prototype && typeof DBCollection.prototype.findOne === "function" && 
    typeof ObjectId !== "undefined" && ObjectId 
) { 
    var _findOne = DBCollection.prototype.findOne, 
     _slice = Array.prototype.slice; 
    DBCollection.prototype.findOne = function() { 
    var args = _slice.call(arguments); 
    if (args.length > 0 && (typeof args[0] === "string" || args[0] instanceof ObjectId)) { 
     args[0] = { _id: args[0] }; 
    } 
    return _findOne.apply(this, args); 
    }; 
} 

})(); 

내가 원래 몽고 쉘에 db.myCollection.constructor을 입력하여 DBCollection 객체/클래스를 발견했다. 그 다음에 findOne이 (a) DBCollection이 전역 액세스 가능하고 (b) DBCollection.prototype, (c) typeof DBCollection.prototype.findOne === "function" (코드 조각과 매우 유사 함)을 검증함으로써 프로토 타입에 정의되었음을 확인했습니다.


편집 : 추가도 ObjectId가 기반 ID를 포함하는 논리 지점.

+1

정확히 내가 무엇을 찾고 있었습니까! 감사! – Shaded

관련 문제