2014-12-11 1 views
4

Так что я хочу сделать, это сделать findOne работать больше, как в Метеор, но через оболочку Монго. Короче говоря, я хочу сделать что-то вроде этого db.collection.findOne("thisIsAnId") и искать его в этой коллекции.Есть ли способ переопределить функции по умолчанию в Mongodb?

Я попытался загружая файл, который имеет это в нем ...

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); 
} 

Где originalFindOne просто цепь по умолчанию findOne, это не работает. Поэтому, после того, как вам не удавалось найти способ переопределить функцию по умолчанию, я подумал, что, возможно, я мог бы создать новую функцию, например db.collection.simpleFindOne(), или что-то в этом роде, но я не могу найти способ привязать ее к оболочке mongo, чтобы она была доступна любому коллекция.

У кого-нибудь есть представление о том, как работают внутренние работы манго, которые могли бы мне помочь?

ответ

4

Попробуйте добавить этот фрагмент в одном из конфигурационных файлов Mongo:

(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); 
    }; 
} 

})(); 

Первоначально я нашел DBCollection объект/класс, набрав db.myCollection.constructor в оболочку Монго. Затем я подтвердил, чтобыл определен на его прототипе, подтвердив, что (a) DBCollection был доступен по всему миру, (b) что существует DBCollection.prototype, и (c) что typeof DBCollection.prototype.findOne === "function" (что очень похоже на фрагмент).


Edit: Добавлена ​​логическая ветвь также охватывает идентификаторы ObjectId на основе.

+1

Именно то, что я искал! Благодаря! – Shaded