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

collection update property of embedded document in array

本文关键字:集合 更新 属性 文档 数组      更新时间:2023-09-26

此代码使用循环来$unset"value"数组中所有嵌入文档的"checked"属性,然后在条件计算结果为 true 时$set该属性。
但是当条件为真时,更新块无法通过设置选中:"checked"来更新嵌入的文档,我知道这是因为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"的数组元素设置为"选中"并$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中)是最好的地方,所有meteor集合都有一个.rawCollection()方法,该方法从底层节点本机驱动程序返回集合对象。

所以一般的逻辑是:

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

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