2012-03-19 83 views
7

我如何使用Node.js +貓鼬+的MongoDB這樣的:如何在MongoDB中使用貓鼬獲取findAndModify func的返回值?

SomeModelSchema.statics.findAndModify = function (query, sort, doc, options, callback) { 
    return this.collection.findAndModify(query, sort, doc, options, callback); 
}; 

SomeModel.findAndModify({}, [], { $inc: { amount: 1 } }, {}, function (err) { 
    if (err) throw err; 
}); 

我可以增加amount成功,但我想要得到的amount新的價值,而無需再次做查詢。有沒有辦法做到這一點?

回答

8

options對象中指定{new:true}。這會導致結果值findAndModify成爲應用更新後的文檔,然後您可以讀取它以獲取新值amount。這裏

細節,表:http://www.mongodb.org/display/DOCS/findAndModify+Command

我相信你的回調將需要採取兩個參數,如: function(err, result){

當回調被觸發,result應包含新的文件(如err一片空白)。

2

我檢查了修士的源代碼,並最終使其工作。即使code documentation說應該如何,但從僧侶的網上documentation不可見。

/** 
* findAndModify 
* 
* @param {Object} search query, or { query, update } object 
* @param {Object} optional, update object 
* @param {Object|String|Array} optional, options or fields 
* @param {Function} callback 
* @return {Promise} 
* @api public 
*/ 

這意味着你可以指定查詢更新作爲單獨的參數,再加上選項作爲第三個參數:

notescollection.findAndModify(
    { "_id": id }, 
    { "$set": { 
     "title": title, 
     "content": content 
    }}, 
    { "new": true, "upsert": true }, 
    function(err,doc) { 
    if (err) throw err; 
    console.log(doc); 
    } 
); 

也可以指定查詢更新作爲第一參數的字段,加選項作爲第二參數:

notescollection.findAndModify(
    { 
    "query": { "_id": id }, 
    "update": { "$set": { 
     "title": title, 
     "content": content 
    }} 
    }, 
    { "new": true, "upsert": true }, 
    function(err,doc) { 
    if (err) throw err; 
    console.log(doc); 
    } 
); 

關於源代碼檢查的更多信息findAndModify函數在collections.js文件中。