更新嵌套数组中的多个对象
Updating a number of objects in a nested array
假设我们有这个文档:
{
"_id" : ObjectId("4faaba123412d654fe83hg876"),
"items" : [
{
"name" : "item_one",
"bought" : true
},
{
"name" : "my_item",
"bought" : true
},
{
"name" : "my_item_three",
"bought" : true
}
]
}
例如,我如何修改数组的前 2 个对象并将其"购买"设置为 false。或者换句话说,我如何更改前 n 个对象的属性。
我想我可以先用这个 ID 做一个db.findOne()
,然后获取项目并使用一个将更改值的函数,然后将整个项目设置为该函数返回的这个新数组。
这可能会完成这项工作,但有没有更快更好的方法?如果我知道要更改的对象数量,有没有办法做到这一点,因此例如它不会是 n 而是 5。
您可以遍历所需的第 n 个对象,并使用 '=' 将购买设置为 false:
for(var i=0; i < n_times; i++){
my_object.items[i].bought = false;
}
如果您事先知道要更新的对象数量,那么可以利用更新中的点表示法通过循环访问数组的元素:
var id = ObjectId("4faaba123412d654fe83hg876");
// Iterate and update using the update query object
for(var i=0; i<n; i++){
var update = { "$set": {} };
// set the update query object
update["$set"]["items."+i.toString()+".bought"] = false;
db.collection.update({"_id": id}, update, {"upsert": false, "multi": true});
}
--
编辑 --
这也可以在一次原子更新中完成,假设您在更新之前创建了更新对象,如下所示
var update = { "$set": {} };
for(var i=0; i<n; i++){
// set the update query object
update["$set"]["items."+i.toString()+".bought"] = false;
}
db.collection.update({"_id": id}, update, {"upsert": false, "multi": true});
查看下面的演示
var update = { "$set": {} };
for(var i=0; i<5; i++){
// set the update query object
update["$set"]["items."+i.toString()+".bought"] = false;
}
pre.innerHTML = JSON.stringify(update);
<pre id="pre"></pre>
相关文章:
- 如何使用javascript获取嵌套对象中所有子对象的单个属性
- 如何打印嵌套对象的所有值
- 设置嵌套对象属性的更好方法
- 访问嵌套JSON对象的键,其中键是动态的
- 嵌套对象结构
- 如何递归地获取嵌套对象中所有子对象的列表
- 更改嵌套对象的父子相关id
- Node.js:用作对象嵌套元素名称的变量
- Sailsjs创建对象-嵌套创建
- Jquery $.ajax 获取响应与将“this”对象嵌套传递到“success”回调函数冲突
- 从嵌套属性数组中获取对象嵌套值
- 将对象嵌套在另一个数组中
- javascript对象嵌套回调
- 当被引用对象嵌套在ExtJS 5.0.0中时,如何读取它
- 如何在不知道其位置的情况下删除Mongo对象(嵌套的2个数组)
- 排序嵌套在对象中的数组,该对象嵌套在另一个对象中
- Javascript对象嵌套
- 在Angular中创建多维/嵌套对象(嵌套forEach循环)
- 仅列出jquery中包含json对象嵌套的所有键
- 如何将一个javascript对象嵌套在另一个对象中