簡體   English   中英

MongoDB - 如何在嵌套數組中查找和更新元素

[英]MongoDB - How to find and update elements in a nested array

這是集合:

db.employees.insertMany([
   {
    "data": {
      "category": [
        {
          "name": "HELLO",
          "subcategory": [
            "EDUCATION",
            "ART",
            
          ]
        },
         {
          "name": "HELLO",
          "subcategory": [
            "GG",
            "ART",
            
          ]
        },
        {
          "name": "HELLO",
          "subcategory": [
            "EDUCATION",
            "SHORE",
            
          ]
        }
      ]
    }
  },
  {
    "data": {
      "category": [
        {
          "name": "HELLO",
          "subcategory": [
            "EDUCATION",
            "HELLO",
            
          ]
        }
      ]
    }
  },
  {
    "data": {
      "category": [
        {
          "name": "HELLO",
          "subcategory": [
            "GG",
            "ART",
            
          ]
        }
      ]
    }
  }
]);

我想要的是用包含“教育”的“子類別”定位“類別”中的元素,並用另一個字符串替換“教育”,比如說“體育”。

我嘗試了幾個命令,但沒有真正完成這項工作:

db.employees.updateMany({
  "data.category.subcategory": "EDUCATION"
},
{
  "$set": {
    "data.category.$": {
      "subcategory": "SPORTS"
    }
  }
})

我看到的是它不會通過替換元素來更新元素,也不會替換符合條件的每個元素。

認為帶有聚合管道的 MongoDB 更新可以滿足您的方案。

  1. $set - 設置data.category值。

    1.1。 $map - 迭代data.caetgory中的每個元素並返回一個數組。

    1.1.1。 $mergeObjects - 將當前文檔與來自1.1.1.1subcategory字段的文檔合並。

    1.1.1.1 $map - 迭代subcategory數組中的每個值。 使用$cond將單詞EDUCATION替換為SPORTS如果完成,否則使用現有值 ( $$this )。

db.employees.updateMany({
  "data.category.subcategory": "EDUCATION"
},
[
  {
    "$set": {
      "data.category": {
        $map: {
          input: "$data.category",
          in: {
            $mergeObjects: [
              "$$this",
              {
                subcategory: {
                  $map: {
                    input: "$$this.subcategory",
                    in: {
                      $cond: {
                        if: {
                          $eq: [
                            "$$this",
                            "EDUCATION"
                          ]
                        },
                        then: "SPORTS",
                        else: "$$this"
                      }
                    }
                  }
                }
              }
            ]
          }
        }
      }
    }
  }
]

示例 Mongo Playground

這是使用"arrayFilters"的另一種方法。

db.collection.update({
  "data.category.subcategory": "EDUCATION"
},
{
  "$set": {
    "data.category.$[].subcategory.$[elem]": "SPORTS"
  }
},
{
  "arrayFilters": [
    { "elem": "EDUCATION" }
  ],
  "multi": true
})

mongoplayground.net上試試。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM