让我们说这个文件:
{
"_id" : ObjectId("4faaba123412d654fe83hg876"),
"items" : [
{
"name" : "item_one",
"bought" : true
},
{
"name" : "my_item",
"bought" : true
},
{
"name" : "my_item_three",
"bought" : true
}
]
}
例如,我如何修改数组的前2个对象并设置他们的"已购买"为假。或者换句话说,我怎么能改变前n个对象的属性。
我认为我可以首先使用此ID执行db.findOne()
而不是获取项目并使用将更改值的函数,然后将整个项目设置为此函数返回的新数组。
那可能会做的工作,但是有更快更好的方法吗?如果我知道要更改的对象数量,有没有办法做到这一点,所以它不会是n而是5例如。
答案 0 :(得分:3)
您可以循环使用所需的第n个对象,并使用' ='
将买方设置为falsefor(var i=0; i < n_times; i++){
my_object.items[i].bought = false;
}
答案 1 :(得分:1)
如果您知道要预先更新的对象数量,那么您可以利用更新中的 dot notation 来访问带有循环的数组元素:
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>