【问题标题】:MongoDB how to filter in nested arrayMongoDB如何过滤嵌套数组
【发布时间】:2021-02-17 23:28:27
【问题描述】:

我有以下数据。我想在属于name=name2的内部数组中找到value=v2(删除不等于v2的其他值)。如何为此编写聚合?对我来说最困难的部分是过滤仅属于 name=name2nestedArray

{
  "_id": 1,
  "array": [
    {
      "name": "name1",
      "nestedArray": [
        {
          "value": "v1"
        },
        {
          "value": "v2"
        }
      ]
    },
    {
      "name": "name2",
      "nestedArray": [
        {
          "value": "v1"
        },
        {
          "value": "v2"
        }
      ]
    }
  ]
}

所需的输出如下。请注意value=v1 保留在name=name1 下,而value=v1name=name2 下被删除。

{
  "_id": 1,
  "array": [
    {
      "name": "name1",
      "nestedArray": [
        {
          "value": "v1"
        },
        {
          "value": "v2"
        }
      ]
    },
    {
      "name": "name2",
      "nestedArray": [
        {
          "value": "v2"
        }
      ]
    }
  ]
}

【问题讨论】:

  • 不清楚您到底想要什么:获取带有value=v1name=name1 的文档,或者删除给定valuename 的值?
  • @chridam。编辑了问题。例如,输入为 name="name2", value="v2"。意思是我想查看外部“数组”,并查找名称=“name2”的条目,然后我想查看它的“嵌套数组”并删除值!=“v2”的条目。如果外部“数组”中没有 name="name2" 的条目,则不会删除任何内容。
  • @J.F.编辑了问题。我的意思是删除一个给定值和名称的值

标签: mongodb filter nested mongodb-query aggregation


【解决方案1】:

你可以试试,

  • $set 更新array 字段,$map 迭代array 字段循环,检查条件是否名称为name2 然后$filter 以从v2 字段和$mergeObject 获取匹配值v2 文档将对象与可用对象合并
let name = "name2", value = "v2";
db.collection.aggregate([
  {
    $set: {
      array: {
        $map: {
          input: "$array",
          in: {
            $mergeObjects: [
              "$$this",
              {
                $cond: [
                  { $eq: ["$$this.name", name] }, //name add here
                  {
                    nestedArray: {
                      $filter: {
                        input: "$$this.nestedArray",
                        cond: { $eq: ["$$this.value", value] } //value add here
                      }
                    }
                  },
                  {}
                ]
              }
            ]
          }
        }
      }
    }
  }
])

Playground

【讨论】:

    【解决方案2】:

    您可以使用以下聚合查询:

    db.collection.aggregate([
      {
        $project: {
          "array": {
            "$concatArrays": [
              {
                "$filter": {
                  "input": "$array",
                  "as": "array",
                  "cond": {
                    "$ne": [
                      "$$array.name",
                      "name2"
                    ]
                  }
                }
              },
              {
                "$filter": {
                  "input": {
                    "$map": {
                      "input": "$array",
                      "as": "array",
                      "in": {
                        "name": "$$array.name",
                        "nestedArray": {
                          "$filter": {
                            "input": "$$array.nestedArray",
                            "as": "nestedArray",
                            "cond": {
                              "$eq": [
                                "$$nestedArray.value",
                                "v2"
                              ]
                            }
                          }
                        }
                      }
                    }
                  },
                  "as": "array",
                  "cond": {
                    "$eq": [
                      "$$array.name",
                      "name2"
                    ]
                  }
                }
              }
            ]
          }
        }
      }
    ])
    

    MongoDB Playground

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-02-19
      • 2018-11-22
      • 1970-01-01
      • 2019-10-23
      • 2022-12-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多