集合更新嵌入文档

时间:2016-03-10 23:37:11

标签: mongodb meteor

我正在阅读docs,但无法找到办法进行“双重”更新。

首先是集合:

meteor:PRIMARY> db.radioOptions.find({}).pretty();
{
	"_id" : "n8DsDzsPL8JTRFEQ8",
	"name" : "optionType",
	"value" : [
		{
			"name" : "1stOption",
			"caption" : "1st Option",
			"checked" : true <-------- run code added this property
		},
		{
			"name" : "2ndOption",
			"caption" : "2nd Option",
			"checked" : true <-------- run code added this property
		}
	]
}

这是运行的代码,它添加了标记的属性。 credit

  RadioOptions.update(
    {name: obj.name, 'value.name': obj.value},
    {$set: {'value.$.checked': true}}
  );

但我还想将其他嵌入文档设置为false或删除其属性checked:true,以便只有一个嵌入文档,其checked字段设置为true或checked。

我失败的尝试:暴力

  RadioOptions.update(
    {name: obj.name, 'value.name': obj.value},
    {$set: {'value.$.checked': true}, $set: {$ne: {'value.$.checked': false}}}
  );

怎么能这样做?我可以在一次更新方法中执行此操作吗?

编辑阅读建议重复的链接后。

我的更新代码失败,因为更新行正在使用checked:false更新第一个文档,而第二个文档更新checked:true无条件评估的条件,已经过验证可以正确评估。

  var doc = RadioOptions.findOne({name: obj.name});
  if (typeof doc != 'undefined') {
    doc.value.forEach(function (embdoc) {
      // how to update so that to use $unet the "checked" property of all embedded documents in the value array?
      if (embdoc.name == obj.value) {
        RadioOptions.update(
          {name: obj.name, 'value.name': obj.value},
          {$set: {'value.$.checked': true}}
        );
      }
    })
  }

0 个答案:

没有答案