【问题标题】:How to use findOneAndUpdate using an aggregated query in mongoDB?如何在 mongoDB 中使用聚合查询使用 findOneAndUpdate?
【发布时间】:2020-05-16 02:27:07
【问题描述】:

我使用nestJS 作为与MongoDB 连接的后端。我可以访问我的架构中的嵌套数组:

  {
      "id": "productId",
      "name": "productName",
      "price": "productPrice",
      "Categories": [
          {
              "_id": "catId",
              "name": "catName",
              "Subcategories": [
                  {
                      "_id": "subcatId",
                      "name": "subcatName"
                  },
                  {
                      "_id": "subcatId",
                      "name": "subcatName"
                  },
              ]
          },
          {
              "_id": "catId",
              "name": "catName",
              "Subcategories": [
                  {
                      "_id": "subcatId",
                      "name": "subcatName"
                  },
                  {
                      "_id": "subcatId",
                      "name": "subcatName"
                  },
              ]
          }
      ]
  }
  ]

我可以通过以下方式访问类别和子类别:

db.collection.aggregate([
  {
    $match: {
      "id": "productId"
    }
  },
  {
    $unwind: "$Categories"
  },
  {
    $project: {
      "_id": "$Categories._id",
      "name": "$Categories.name"
    }
  }
])
db.collection.aggregate([
  {
    $match: {
      "id": "productId"
    }
  },
  {
    $unwind: "$Categories"
  },
  {
    $match: {
      "Categories._id": "catId"
    }
  },
  {
    $unwind: "$Categories.Subcategories"
  },
  {
    $project: {
      _id: "$Categories.Subcategories._id",
      name: "$Categories.Subcategories.name"
    }
  }
])

我现在面临的问题是如何使用 findOneAndUpdate 方法更新一个类别或子类别。

我将如何访问要更新的正确类别/子类别_id?

提前致谢。

【问题讨论】:

    标签: mongodb mongodb-query nosql nestjs


    【解决方案1】:

    你想像这样使用arrayFilters

    db.collection.updateOne(
        {  
            //query to match document
        },
        { $set: { "Categories.$[cat].name": newValue } }, //set name to new value in categories.
    
        { $set: { "Categories.Subcategories.$[subCat].name": newValue2 } }, //set name to new value in categories.
        { arrayFilters: [ { "cat._id": categoryId }, { "subCat._id": subCategoryId } ] }
    )
    

    显然,您可以替换 name_id 字段以匹配和更新对象中的任何其他字段。

    【讨论】:

    • 感谢您的帮助!我能够在 mongoDB shell 中让它工作。不幸的是,用于 NestJS 的 mongodb 的最新版本是 3.3.0。和数组过滤器不受支持你知道早期版本中的等价物是什么吗?
    • 抱歉,如果您不能使用arrayFilter,您将不得不阅读文档,将其更改为代码,然后保存以确保更新能够满足您的需要。
    【解决方案2】:

    您可以像这样更新类别数据,

    您可以在更新中使用 .$ 更新与您的条件匹配的精确参考

    db.collection.findOneAndUpdate({
        'id':"productId",
        'Categories._id':"catId1"
    },{
        $set:{
            'Categories.$.name':"catName7"
        }
    },{
        new:true
    })
    

    我必须检查 SubCategory 的两个级别,我会检查并发布相同的延迟

    【讨论】:

    • 这适用于类别。非常感谢。抱歉回复晚了!
    猜你喜欢
    • 2015-10-16
    • 2017-10-19
    • 2020-10-18
    • 2021-09-24
    • 2022-11-08
    • 1970-01-01
    • 2015-11-13
    • 1970-01-01
    • 2013-04-21
    相关资源
    最近更新 更多