2016-03-11 45 views
3

此代碼使用一個循環來對$unset「value」數組中所有嵌入文檔的「checked」屬性,然後$set當條件評估爲true時使用該屬性。
但是,當條件爲真時,更新塊無法通過設置選中的「已檢查」來更新嵌入的文檔,我知道因爲meteor:PRIMARY> db.radioOptions.find({}).pretty();在前後給出了相同的結果。數組中嵌入文檔的集合更新屬性

我在做什麼錯?以及如何解決它?由於

meteor:PRIMARY> db.radioOptions.find({}).pretty(); 
 
{ 
 
\t "_id" : "jXQcsXtedQYotKQXG", 
 
\t "name" : "optionType", 
 
\t "value" : [ 
 
\t \t { 
 
\t \t \t "name" : "1stOption", 
 
\t \t \t "caption" : "1st Option" 
 
\t \t }, 
 
\t \t { 
 
\t \t \t "name" : "2ndOption", 
 
\t \t \t "caption" : "2nd Option" 
 
\t \t } 
 
\t ] 
 
} 
 

 

 
     var doc = RadioOptions.findOne({name: obj.name}); 
 
     if (typeof doc != 'undefined') { 
 
     doc.value.forEach(function (embdoc) { 
 
      console.log(embdoc); 
 
      RadioOptions.update(
 
      {name: obj.name, 'value.name': obj.value}, 
 
      {$unset: {'value.$.checked': ""}} 
 
     ); 
 
      if (embdoc.name == obj.value) { 
 
       console.log(obj.name + " " + obj.value); //obj.value = 1stOption for example 
 
       RadioOptions.update(
 
       {name: obj.name, 'value.name': obj.value}, //obj.name = "optionType" 
 
       {$set: {'value.$.checked': "checked"}} 
 
      ); 
 

 
      } 
 
     }) 
 
     }

回答

0

比方說,這是爲你的目標設定數組元素的名稱爲「2ndOption」,以「檢查」和$unset所有其他數組元素。然後,您反而會做的事:

var doc = RadioOptions.findOne({name: obj.name}); 
    if (typeof doc != 'undefined') { 
    // You have to update every element 
    doc.value.forEach(function (embdoc) { 
     RadioOptions.update(
      { "_id": doc._id, "value.name": embdoc.name }, 
      { "$unset": { "value.$.checked": "" } } 
     ) 
    }); 
    // Then just set the one you want 
    RadioOptions.update(
     { "_id": doc._id, "value.name": "2ndOption" }, // <-- actually using a variable of course 
     { "$set": { "value.$.checked": "checked" } } 
    ) 
    } 

現在,如果你實際上已經閱讀你給予你原來的問題重複的問題,所有的響應:

How to Update Multiple Array Elements in mongodb

,那麼你會已經看到response there提到處理所有這些多重更新的最佳方式是在底層驅動程序中使用「Bulk」API方法。並且在更新多個元素的一般過程中也有一些有用的提示。

在「服務器」(而不是minimongo)是最好的地方,所有流星收藏有一個.rawCollection()方法,它從基礎節點本地驅動程序返回集合對象。

所以一般的邏輯是:

  • 環路所有數組元素和更新爲「關閉」
  • 比賽要「打開」

而且在做得最好的元素批量而不是爲每次更新回覆。

+1

如果你已經有內存中的文檔(你已經完成了一個findOne),爲什麼不按照需要修改'value'字段,然後'設置'整個事情而不是做幾十個更新?這不是批評,我只是想知道這是否是我錯過的問題的一個參數。 –

相關問題