2014-06-20 30 views
9

我嘗試做一個findAndModifiy與的NodeJS MongoDB中,這是我的代碼:的NodeJS和MongoDB FindAndModify()需要刪除或更新

var nextBill = function (db, success, log) { 
    var collection = db.collection('autoincrements'); 
    log.debug('autoIncrementRepository', 'nextBill'); 
    var result = collection.findAndModify({ 
     query: { _id: 'auto' }, 
     update: { $inc: { bill: 1 } }, 
     new: true 
    }); 

    success(result.bill); 
}; 

編輯:

與回調嘗試

collection.findAndModify({ 
     query: { _id: 'auto' }, 
     update: { $inc: { bill: 1 } }, 
     new: true 
    }, function (e, result) { 
     success(result.budget); 
    }); 

但給我錯誤需要刪除或更新..但即時通訊做它..

+0

您使用哪種驅動程序? MongoDB節點本地驅動程序需要回調,m so也是如此,僧侶和其他人也一樣。 –

+0

本機驅動程序,但使用回調我得到相同的錯誤:。我將用我的實際代碼編輯我的awnser。 – colymore

回答

17

.findAndModify()遇見hod在節點本地驅動程序實現方面與mongo shell實現不同。做一個更新如上這樣做:

collection.findAndModify(
    { "_id": "auto" }, 
    { "$inc": { "bill": 1 } }, 
    function(err,doc) { 
    // work here 

    } 
); 

奇怪的是有些刪除您在選項指定所以同樣將「刪除」匹配的文件:

collection.findAndModify(
    { "_id": "auto" }, 
    { "$inc": { "bill": 1 } }, 
    { "remove": true }, 
    function(err,doc) { 
    // work here 

    } 
); 

的主要區別是,你不姓行動的「關鍵」部分。

+0

感謝這個工程,但爲什麼他們不同於shell規範/文檔說的? – Aodh

+0

@Aodh shell規範不是驅動程序實現的規範。你正在閱讀的文檔是mongo本身,而不是驅動程序。閱讀在這裏找到的驅動程序文檔:http://mongodb.github.io/node-mongodb-native/ – wallacer

+0

嗨,我仍然收到錯誤,這是我的代碼 db.collection(nextIDCollection).findAndModify({「_ id」: 1},{$ inc:{「nextID」:1}},function(err,doc){}); 我無法找到代碼有什麼問題。 –

6

http://mongodb.github.io/node-mongodb-native/2.0/api/Collection.html#findAndModify

此上述文獻指定所述第二參數是用於選擇如果多個的匹配查詢使用哪個文件的排序順序。只給出兩個參數將導致「需要刪除或更新」錯誤消息。

collection('MyCollection').findAndModify(
    { _id: "auto" }, 
    [], 
    { $inc: { "bill": 1 } }, 
    { upsert: true, new: true }, 
    function(err,doc) { 
     // work here 
    } 
); 
2
Hi I have followed this and it worked perfectly. 

db.collection('test').findAndModify(
    {hello: 'world'}, // query 
    [['_id','asc']], // sort order 
    {$set: {hi: 'there'}}, // replacement, replaces only the field "hi" 
    {}, // options 
    function(err, object) { 
     if (err){ 
      console.warn(err.message); // returns error if no matching object found 
     }else{ 
      console.dir(object); 
     } 
    }); 
});