首页 > 解决方案 > 当某些文档不包含路径时,mongo updateMany $set 嵌套数组

问题描述

我有一个看似简单的查询来更新 mongo 文档中类似对象的名称。但它失败了,因为并非所有文档都有评论。我应该在文档中寻找什么来解决这个问题并只更新对评论有赞的文档?

    return this.model.updateMany(
      { 
        comments: { 
           $exists: true 
        } 
      },
      {
        $set: {
          'comments.likes.$[like].actor.firstName': user.firstName,
          'comments.likes.$[like].actor.lastName': user.lastName,
        },
      },
      {
        multi: true,
        arrayFilters: [
          { 'like.actor.username': user.username },
        ],
      },
    );

问题是并非所有评论都被喜欢..所以查询抱怨:

WriteError: The path 'comments.likes' must exist in the document in order to apply array updates. 

完整输出:

WriteError: The path 'comments.likes' must exist in the document in order to apply array updates. 
Details:
WriteError({
    "index" : 0,
    "code" : 2,
    "errmsg" : "The path 'comments.likes' must exist in the document in order to apply array updates.",
    "op" : {
        "q" : {
            "comments" : {
                "$exists" : true
            }
        },
        "u" : {
            "$set" : {
                "comments.likes.$[like].actor.firstName" : "GGGJOHN",
                "comments.likes.$[like].actor.lastName" : "Carmichael"
            }
        },
        "multi" : true,
        "upsert" : false,
        "arrayFilters" : [
            {
                "like.actor.username" : "john.carmichael"
            }
        ]
    }
})
WriteError@src/mongo/shell/bulk_api.js:461:48
Bulk/mergeBatchResults@src/mongo/shell/bulk_api.js:841:49
Bulk/executeBatch@src/mongo/shell/bulk_api.js:906:13
Bulk/this.execute@src/mongo/shell/bulk_api.js:1150:21
DBCollection.prototype.updateMany@src/mongo/shell/crud_api.js:655:17
@(shell):1:1

这是 q 中 doc 的说明,其中 comments 是一个数组,单个评论上的 likes 也是一个数组: 在此处输入图像描述

标签: mongodb

解决方案


如果您在更新部分查询的匹配部分下添加您正在检查对象中是否likes存在属性怎么办comments

return this.model.updateMany(
  { 
   "comments.likes": {  // <---
       $exists: true 
    } 
  },
  {
    $set: {
      'comments.likes.$[like].actor.firstName': user.firstName,
      'comments.likes.$[like].actor.lastName': user.lastName,
    },
  },
  {
    multi: true,
    arrayFilters: [
      { 'like.actor.username': user.username },
    ],
  },
);

推荐阅读