集合中嵌入文档的集合更新属性

时间:2016-03-11 08:28:03

标签: javascript mongodb meteor mongodb-query

此代码使用循环到$unset“值”数组中所有嵌入文档的“已检查”属性,然后$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"}} ); } }) }在之前和之后给出了相同的结果。

我做错了什么?以及如何解决它?谢谢

view.dispatchTouchEvent(MotionEvent.obtain(MotionEvent.obtain(1,1,1,0.0f,0.0f,0)))

1 个答案:

答案 0 :(得分:0)

假设你的目标是将名为“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" } }
    ) 
  }

现在,如果你真的已经阅读了关于重复问题的所有回复,那么你就会得到原始问题:

  

How to Update Multiple Array Elements in mongodb

然后你会看到response there提到处理所有这些多重更新的最佳方法是在底层驱动程序中使用“批量”API方法。并且还提供了一些有关更新多个元素的一般过程的有用提示。

在“服务器”(不在minimongo中)是最好的地方,所有流星集合都有一个.rawCollection()方法,它从底层节点本机驱动程序返回集合对象。

所以一般逻辑是:

  • 循环所有数组元素并更新为“关闭”
  • 匹配您要“开启”的元素

最好以批量方式完成,而不是每次更新都来回响应。