[英]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" } }
)
}
现在,如果您确实阅读了重复问题的所有回复,那么您的原始问题就是:
然后你会看到那里提到处理所有这些多重更新的最佳方法的响应是在底层驱动程序中使用“批量”API方法。 并且还提供了一些有关更新多个元素的一般过程的有用提示。
在“服务器”(不在minimongo中)是最好的地方,所有流星集合都有一个.rawCollection()
方法,它从底层节点本机驱动程序返回集合对象。
所以一般逻辑是:
最好以批量方式完成,而不是每次更新都来回响应。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.