【问题标题】:mongo updateMany $set nested array when some docs do not contain the path当某些文档不包含路径时,mongo updateMany $set 嵌套数组
【发布时间】:2020-10-20 00:41:10
【问题描述】:

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

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

问题是不是所有的 cmets 都喜欢.. 所以查询抱怨:

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 的说明,其中 cmets 是一个数组,单个评论上的 likes 也是一个数组:

【问题讨论】:

  • 嗨,你有没有想过这个问题?我有同样的问题。几乎就像由于某种原因需要将存在作为数组过滤器的一部分。
  • 为了记录,我能够用这个答案解决我的问题:stackoverflow.com/questions/58555989/…
  • 我没有在肮脏的黑客中编码 - 感谢您提供链接

标签: mongodb


【解决方案1】:

如果你添加了 在更新部分查询的匹配部分下,您正在检查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 },
    ],
  },
);

【讨论】:

  • 这也不起作用,在比赛中添加 cmets 和 likes 也不起作用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-07-28
  • 1970-01-01
  • 1970-01-01
  • 2021-07-20
  • 1970-01-01
  • 1970-01-01
  • 2013-11-24
相关资源
最近更新 更多