簡體   English   中英

集合中嵌入文檔的集合更新屬性

[英]collection update property of embedded document in array

此代碼使用循環來$unset “value”數組中所有嵌入文檔的“checked”屬性,然后在條件求值為true時$set
但是當條件為真時,更新塊無法通過設置已檢查來更新嵌入文檔:“已檢查”,我知道因為meteor:PRIMARY> db.radioOptions.find({}).pretty(); 之前和之后給出相同的結果。

我究竟做錯了什么? 以及如何解決它? 謝謝

 meteor:PRIMARY> db.radioOptions.find({}).pretty(); { "_id" : "jXQcsXtedQYotKQXG", "name" : "optionType", "value" : [ { "name" : "1stOption", "caption" : "1st Option" }, { "name" : "2ndOption", "caption" : "2nd Option" } ] } 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"}} ); } }) } 

假設您的目標是將名為“2ndOption”的數組元素設置為“checked”,並$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" } }
    ) 
  }

現在,如果您確實閱讀了重復問題的所有回復,那么您的原始問題就是:

如何在mongodb中更新多個數組元素

然后你會看到那里提到處理所有這些多重更新的最佳方法的響應是在底層驅動程序中使用“批量”API方法。 並且還提供了一些有關更新多個元素的一般過程的有用提示。

在“服務器”(不在minimongo中)是最好的地方,所有流星集合都有一個.rawCollection()方法,它從底層節點本機驅動程序返回集合對象。

所以一般邏輯是:

  • 循環所有數組元素並更新為“關閉”
  • 匹配您想要“打開”的元素

最好以批量方式完成,而不是每次更新都來回響應。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM