2015-01-15 51 views
2

我在mongodb docs中看到可以在單個更新命令中發送多個更新語句。你如何使用Node.js和Mongoose來做到這一點?Mongoose - 如何使用多個更新語句執行單個更新

db.runCommand({ 
    update: <collection>, 
    updates: 
     [ 
     { q: <query>, u: <update>, upsert: <boolean>, multi: <boolean> }, 
     { q: <query>, u: <update>, upsert: <boolean>, multi: <boolean> }, 
     { q: <query>, u: <update>, upsert: <boolean>, multi: <boolean> }, 
     ... 
     ], 
    ordered: <boolean>, 
    writeConcern: { <write concern> } 
}) 

看來我們可以像這樣訪問驅動程序的數據庫對象。

YourModel.db.db 

有興趣知道是否有更多的貓鼬友好的方式去做呢?

+0

使用批量操作http://mongodb.github.io/node-mongodb-native/api-generated/ordered.html和http://docs.mongodb.org/manual/reference/method/db.collection。 initializeOrderedBulkOp /#db.collection.initializeOrderedBulkOp – Disposer 2015-01-15 16:41:10

回答

2

對於貓鼬直接沒有具體現在這種權利的任何實施。但是在編寫mongoose API時仍然建立在節點本地驅動程序之上,這使得通過使用.collection訪問器可以從模型訪問所有相同的方法。

所以Bulk API方法然後可:

var bulk = Model.collection.initializeOrderedBulkOp(); 
var index = 0 

// start some loop of statements 
{ 
    bulk.find({ })    // find to match 
     .updateOne({});  // update one  

    bulk.find({}) 
     .update({});   // applies to multi 

    bulk.find({}) 
     .upsert().updateOne(); // marks an "upsert" 
} 

bulk.execute(function(err,response) { 
    // response object has details of operations 
}); 

此外,還有所有可以包含在「集中」批其他方法,如.insert().remove(),所以此工程乾淨了一點比原始的命令形式。實際上,這會將其分解到底層。

雖然基礎驅動程序方法不像mongoose方法實現方式那樣工作,但要小心。最大的區別在於與數據庫的連接。 mongoose連接的方式以及如何在連接回調之外調用語句意味着在嘗試執行任何操作之前,自己的方法會「等待」該連接。

所以你可以使用它,但是你需要確保在這個代碼被調用之前,其他一些「mongoose」方法總是被觸發。或者以其他方式放置在連接回調或任何您需要的連接檢測和保證方法中。