数组中嵌入文档的集合更新属性
collection update property of embedded document in array
此代码使用循环来$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()
方法,该方法从底层节点本机驱动程序返回集合对象。
所以一般的逻辑是:
- 循环所有数组元素并更新为"关闭"
- 匹配您要"打开"的元素
最好批量完成,而不是每次更新都来回响应。
相关文章:
- 使用它更新集合中的嵌套数组's索引
- Backbone.js批量更新集合
- Meteor.js只更新一个参数,而不是整个集合
- 登录后Meteor更新集合
- 如何更新集合数据并使用骨干木偶重新渲染
- 如何更新集合上的 TTL
- React:使用索引变量更新嵌套集合
- Expressjs&集合中的MongoDB更新对象's数组
- Meteor使用对象更新集合
- 更新MongoDB集合中数组中的对象
- Meteor Update集合-未捕获错误:不允许.不受信任的代码只能通过ID更新文档.[403]
- 数组中嵌入文档的集合更新属性
- 同时更新 2 个不同的集合
- 从服务器更新的 meteor 集合,不会在客户端上被动排序
- 主干.js:使用不同的数据更新集合
- MongoDB外壳:如何从集合更新集合
- 主干:传递或检索集合更新的详细信息
- 通过jquery使用集合更新rails部分
- Backbone js自动刷新/重载服务器上的集合,并使用集合更新视图
- 从集合更新模型