【问题标题】:collection update property of embedded document in array数组中嵌入文档的集合更新属性
【发布时间】:2016-03-11 08:28:02
【问题描述】:

此代码使用循环到 $unset "value" 数组中所有嵌入文档的 "checked" 属性,然后是 $set 当条件评估为 true 时的属性。
但是当条件为真时,更新块无法通过设置检查来更新嵌入文档:“检查”,我知道因为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"}}
            );

          }
        })
      }

【问题讨论】:

    标签: javascript mongodb meteor mongodb-query


    【解决方案1】:

    假设您的目标是将名称为“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() 方法,该方法从底层节点原生驱动程序返回集合对象。

    所以一般的逻辑是:

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

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

    【讨论】:

    • 如果您已经在内存中有文档(您已经完成了 findOne),为什么不根据需要修改 value 字段,然后修改 $set 整个事情,而不是进行数十次更新?这不是批评,我只是想知道这是否是我错过的问题的一个参数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-02
    • 2018-03-10
    • 2018-06-03
    相关资源
    最近更新 更多