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

Javascript 更新嵌套数组中的多个对象,javascript,mongodb,Javascript,Mongodb,假设我们有这个文档: { _id:Objectd4FAABA123412D654FE83HG876, 项目:[ { 名称:第一项, 买来的:真的 }, { 名称:我的项目, 买来的:真的 }, { 姓名:我的第三项, 买来的:真的 } ] } 例如,如何修改数组的前两个对象并将其值设置为false。或者换句话说,我如何更改前n个对象的属性 我想我可以先用这个ID做一个db.findOne,然后使用一个函数来更改值,然后将整个项设置为这个函数返回的新数组 这可能会起作用,但有没有更快更好的方法?如

假设我们有这个文档:

{ _id:Objectd4FAABA123412D654FE83HG876, 项目:[ { 名称:第一项, 买来的:真的 }, { 名称:我的项目, 买来的:真的 }, { 姓名:我的第三项, 买来的:真的 } ] } 例如,如何修改数组的前两个对象并将其值设置为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:{};
forvar i=0;iYes您可以使用.findOne或类似逻辑,然后更改文档的内容,并将其重新保存或类似。虽然这不是一个很好的模式,因为从读取文档到保存文档之间可能会发生其他写入操作。如果您需要同时对多个数组元素进行这种更新,那么最好考虑一个不同的模型,即集合而不是嵌入的。是的,我正想使用点符号,这就是为什么我在我的问题中包含了具有精确的项项的部分。谢谢。但是我不喜欢这样的更新吗?如果我在此之前构造一个更新对象并只进行1次更新,那不是更容易吗?@chning是的,这是很有可能的,实际上会推荐这种方法。让我用这种方法更新我的答案;对于var i=0;i