2012-03-19 32 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文件中。