如何在MongoDB中通过嵌套结构查询未知Key的值文档?

问题描述 投票:0回答:1

我在使用 MongoDB 查询时遇到问题,这是 MongoDB 中的数据结构:

{
  "_id": "aaaaa",
  "groups": [
    {
      "name": "group0",
      "props": {
          "unknown1": "value1",
          "unknown2": "value2",
          "unknown3": "value3"
      }
    },
    {
      "name": "group1",
      "props": {
          "unknown4": "value4",
          "unknown5": "value5",
          "unknown6": "value6"
      }
    }
  ]
}

我想查询嵌套字段具有特定值但键未知的文档,例如: groups[X].props.unknownX.valueX = valueA。

我尝试使用下面的聚合查询:

db.collection.aggregate([
  {
    $project: {
      "props": "$groups.props"
    }
  },
  {
    $unwind: "$props"
  },
  {
    $project: {
      "result": {
        $objectToArray: "$props"
      }
    }
  },
  {
    $match: {
      $and: [
        {
          "result.k": "unknown2",
          "result.v": "value1"
        }
      ]
    }
  },
  {
    "$project": {
      result: {
        "$arrayToObject": "$result"
      }
    }
  }
])

沙盒:https://mongoplayground.net/p/71TYThQnxTP

结果是:

[
  {
    "_id": "aaaaa",
    "result": {
      "unknown1": "value1",
      "unknown2": "value2",
      "unknown3": "value3"
    }
  }
]

但我希望它是:

[]

不应该是数组,因为我通过查询条件使用了$and操作

props.unknown2 = value1
。但好像又回来了
props.unknown2 exists and props.unknownX.value1 exists
,我是不是做错了什么?

有人可以帮忙吗?我将不胜感激。谢谢!

mongodb aggregate
1个回答
0
投票

您当前使用

$match
阶段条件的查询仅显示键和值存在。但是它不能保证键和值必须在同一个对象(键值对)中。

您应该使用

$filter
运算符按键和值过滤数组中的元素。接下来,通过不等于空数组
[]
比较过滤后的数组来过滤(根文档)。

  {
    $match: {
      $expr: {
        $ne: [
          {
            $filter: {
              input: "$result",
              cond: {
                $and: [
                  {
                    $eq: [
                      "$$this.k",
                      "unknown2"
                    ]
                  },
                  {
                    $eq: [
                      "$$this.v",
                      "value1"
                    ]
                  }
                ]
              }
            }
          },
          []
        ]
      }
    }
  }

演示 1 @ Mongo Playground

通过构建您的搜索条件,可以使用最短的查询来实现类似的结果,例如:

db.collection.aggregate([
  {
    $match: {
      "groups.props.{key}": "{value}"
    }
  }
])

因此将

{key}
{value}
替换为:

db.collection.aggregate([
  {
    $match: {
      "groups.props.unknown2": "value1"
    }
  }
])

演示 2 @ Mongo Playground

© www.soinside.com 2019 - 2024. All rights reserved.