更新 mongodb 嵌入式数组中的所有元素



我有一个用户文档,里面有一个注释(对象(数组。 我正在尝试在数组中的所有项目上设置一个新字段 (_id(。但它没有触及任何东西。这是我当前的代码,我错过了什么吗?

db.users.update(
{'notes.added': '2018-10-22 04:42:45.336Z'},
{'$set': {'notes.$._id': new ObjectId()}},
{multi: true}
);

此外,我的目标是所有笔记,添加等于该日期,是否可以在不指定参数的情况下定位所有笔记?

您只需要在查询参数中包含数组。使用 notes.add 等属性将不起作用。$ 运算符需要查询运算符中的数组进行迭代。

db.users.update({notes:{$exists: true}}, {$set:{"notes.$._id": new ObjectId()}}, {multi:true});

希望对您有所帮助。

编辑1: 如果您有多个文档,并且想要编辑所有文档中的所有数组,则需要使用 update许多像这样:

db.users.updateMany({notes:{$exists: true}}, {$set:{"notes.$[elem]._id": new ObjectId()}},{arrayFilters:[{"elem.a" : {$gte: 0}}]});

其中arryFilters是对数组元素的过滤器。此查询将更新属性 a 的值大于或等于 0 的所有数组。 这样做时,您也可以在查询中使用 notes.property。只需将其括在"中即可。

如果您想更新所有至少具有一个元素对象的文档注释数组,那么您还需要像这样编写代码

db.users.update(
{"notes": { $exists: true, $not: {$size: 0} }}, 
{'$set': {'notes.$._id': new ObjectId()}}, 
{multi: true}

(;

添加日期查询后,只需像这样添加您的条件

db.users.update(
{"notes": { $exists: true, $not: {$size: 0} }, 'notes.added': '2018-10-22 04:42:45.336Z'}, 
{'$set': {'notes.$._id': new ObjectId()}}, 
{multi: true}
);

最新更新