2017-08-04 71 views
0

假設下面的收集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 
     } 
    ) 
    } 
    }) 
}) 

謝謝。

+0

你需要匹配givenArray的所有值嗎? – Eric

+0

不,至少在價值應該匹配 –

+0

更新工作得很好,沒有任何理由做這樣的循環,你在第二次嘗試中顯示。我建議你實際上沒有正確的輸入或可能是輸入或文檔內容實際上包含不匹配的字符串。無論如何,失敗是不可複製的,因爲我可以複製發佈的文檔,並複製更新聲明並獲得預期的結果。 –

回答

0

如果你想匹配您的givenArray的所有值,然後使用$所有

{values:{$all:givenArray}} 

如果你想匹配您的givenArray的一個值,然後使用$在(你沒有,應該工作,即使如果是數組,請參閱this:使用$ in運算符來匹配數組中的值)

0

db.yourColllection.update({values:{$ elemMatch:{$ in:[123,078,467]}}} ,{$ set:{updated:true}},{multi:true}); 應該是您正在尋找的最佳解決方案。

相關問題