更新mongodb嵌入式阵列中的所有元素

时间:2018-10-22 05:55:09

标签: javascript mongodb

我有一个用户文档,其中包含一个Notes(对象)数组。 我正在尝试在数组中的所有项目上设置一个新字段(_id)。但是它什么都没有碰。这是我当前的代码,我有什么遗漏吗?

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

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

2 个答案:

答案 0 :(得分:1)

您只需要在查询参数中包括数组。无法使用像notes.add这样的属性。 $运算符需要查询运算符中的数组进行迭代。

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

希望有帮助。

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

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

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

答案 1 :(得分:0)

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

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}
);