此代码使用循环到$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)))
答案 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" } }
)
}
现在,如果你真的已经阅读了关于重复问题的所有回复,那么你就会得到原始问题:
然后你会看到response there提到处理所有这些多重更新的最佳方法是在底层驱动程序中使用“批量”API方法。并且还提供了一些有关更新多个元素的一般过程的有用提示。
在“服务器”(不在minimongo中)是最好的地方,所有流星集合都有一个.rawCollection()
方法,它从底层节点本机驱动程序返回集合对象。
所以一般逻辑是:
最好以批量方式完成,而不是每次更新都来回响应。