更新嵌套数组中的多个对象

时间:2015-06-12 11:09:32

标签: javascript mongodb

让我们说这个文件:

{
    "_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例如。

2 个答案:

答案 0 :(得分:3)

您可以循环使用所需的第n个对象,并使用' ='

将买方设置为false
for(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>