假設下面的收集myCollection
:如果數組包含來自另一個數組的值,如何更新文檔?
{
values: [123, 456, 789],
name: "name1"
},
{
values: [123, 543, 654],
name: "name2"
},
{
values: [456, 876, 098],
name: "name3"
}
我怎麼能只更新其values
包含從給定陣列的任何值這些文件?
實施例:
var givenArray = [123, 078, 467];
db.myCollection.update(
{values:{$in:givenArray}},// <-- here is the problem
{$set:{updated:true}},
{multi:true}
);
由於values
是一個數組,$in
不工作(當然,我想單獨.update
將不起作用)
預期的輸出應爲:
{
values: [123, 456, 789],
name: "name1",
updated: true
},
{
values: [123, 543, 654],
name: "name2",
updated: true
},
{
values: [456, 876, 098],
name: "name3"
}
UPDATE
一個可行的解決方案是下面的,但它似乎並不爲最佳:
db.myCollection.find().forEach(function(doc){
givenArray.forEach(function(item){
if (doc.values.indexOf(item)>=0) {
db.myCollection.update(
{_id:doc._id},
{
$set:{updated:true}
},
{
multi:true
}
)
}
})
})
謝謝。
你需要匹配givenArray的所有值嗎? – Eric
不,至少在價值應該匹配 –
更新工作得很好,沒有任何理由做這樣的循環,你在第二次嘗試中顯示。我建議你實際上沒有正確的輸入或可能是輸入或文檔內容實際上包含不匹配的字符串。無論如何,失敗是不可複製的,因爲我可以複製發佈的文檔,並複製更新聲明並獲得預期的結果。 –