2016-03-06 73 views
4

我需要更新一個集合中的某些文檔,並將更新文檔的_id的數組發送到另一個集合。Mongodb - 返回所有更新文檔的_id數組

由於update()返回更新的項目不是他們的IDS,我想出了以下獲得數組的

var docsUpdated = []; 
var cursor = myCollection.find(<myQuery>); 
cursor.forEach(function(doc) { 
    myCollection.update({_id : doc._id}, <myUpdate>, function(error, response){ 
    docsUpdated.push(doc._id); 
    }); 
}); 

或者我可以這樣做:

var docsUpdated = myCollection.distinct("_id", <myQuery>); 
myCollection.update(<myQuery>, <myUpdate>, {multi : true}); 

我猜測第二個版本會更快,因爲它只調用數據庫兩次。但是這兩者看起來效率低下 - 沒有多個數據庫調用的情況下還有另一種方法嗎?還是我過分複雜?

+0

後,我搜索一些相關帖子在這裏,似乎你的第二個選擇可能會更好... – zangw

+0

是的我的第二個問題是:如果任何更新失敗(例如,因爲它打破了架構規則) - 那麼_id將在docsUpdated數組中,但是doc不會被更新。 (這隻發生在我身上) – rubie

+0

哇,也許[批量操作](https://docs.mongodb.org/manual/reference/method/Bulk/)可能是你的一個選擇... – zangw

回答

0

我認爲你需要光標操作「.aggregate()」

db.orders.aggregate([ 
       { $group: { _id: "$_id"} } 
       ]) 

東西沿着返回集合中的所有ID的結果那些行