【问题标题】:Update nested object in array MongoDB更新数组 MongoDB 中的嵌套对象
【发布时间】:2022-02-01 12:27:56
【问题描述】:

我需要查找和更新与查询对应的类别的文档。数组可以包含多个对应的 id。

查询:

{
 "ids": ["61f1cda47018c60012b3dd01", "61f1cdb87018c60012b3dd07"],
 "userId": "61eab3e57018c60012b3db3f"
}

我收集了以下文件:

`{

   "_id":{"$oid":"61f1cdd07018c60012b3dd09"},
   "expenses":[
     {"category":"61eafc104b88e154caa58616","price":"1111.00"},                  
     {"category":"61f1cdb87018c60012b3dd07","price":"2222.00"}, 
     {"category":"61f1cda47018c60012b3dd01","price":"1241.00"}, 
     {"category":"61f1cdb87018c60012b3dd07","price":"111.00"}
   ],
   "userId":"61eab3e57018c60012b3db3f"
 }`

我的方法:

  async myMethod(ids: [string], userId: string) {
try {
  const { ok } = await this.ExpensesModel.updateMany(
    {"userId": userId, "expenses.category": { $in: ids }},
    {$set: {"expenses.$.category": "newCategoryID"}}
  );
  return ok
} ........

id 的路径数组 ["61f1cda47018c60012b3dd01","61f1cdb87018c60012b3dd07","61f1cdb87018c60012b3dd07"] 和 userId,此代码仅按文档更新 1 个类别。

那么我可以使用 mongo 内置方法来实现吗?或者我需要自己找到匹配的文档并在更新或插入之后对其进行更新;

【问题讨论】:

    标签: node.js mongodb mongoose graphql nestjs


    【解决方案1】:

    更新为arrayFilters

    db.collection.update({
      "expenses.category": {
        $in: [
          "61f1cda47018c60012b3dd01",
          "61f1cdb87018c60012b3dd07"
        ]
      }
    },
    {
      $set: {
        "expenses.$[elem].category": "61eab3e57018c60012b3db3f"
      }
    },
    {
      arrayFilters: [
        {
          "elem.category": {
            $in: [
              "61f1cda47018c60012b3dd01",
              "61f1cdb87018c60012b3dd07"
            ]
          }
        }
      ]
    })
    

    mongoplayground

    【讨论】:

    • 您的提示帮助我朝着正确的方向前进,使其适应我的代码,稍微更新了一下,一切正常,非常感谢!
    • 太棒了!如果您想将category 分配给userId 的值,该怎么做呢? IOW,你怎么能用管道中的东西替换arrayFilters
    • @rickhg12hs 如果您可以根据需要编辑您的问题会更好。确保您希望 update db 中的文档或 find 使用 aggregate 输出。
    • 抱歉,因为我不是 OP,所以在 cmets 中提出问题对我来说是一种不好的形式,但我认为这可能是对您 mongoplayground.net 贡献的快速更新。只是为了让我能更好地理解 MongoDB update,如何修改上述内容,以便将“常量”(“61eab3e57018c60012b3db3f”)作为新值,而不是将新值设置为 $userId。我尝试用$userId 替换常量,但这不起作用,arrayFilters 似乎不适用于update 中的管道。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 2015-01-31
    • 1970-01-01
    • 1970-01-01
    • 2023-01-12
    相关资源
    最近更新 更多