如何显示集合中的多级数组数据?

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

我需要显示集合中的值列表。

我有一个具有以下值的集合:

[
  {
    "Items": [
      {
        "Key": "Key1",
        "Values": [
          {
            "Value": "Value 1",
            "EndDT": "2024-01-31T15:43:53.000Z"
          },
          {
            "Value": "Value 2",
            "EndDT": null
          }
        ]
      },
      {
        "Key": "Key2",
        "Values": [
          {
            "Value": "Value 3",
            "EndDT": "2024-01-31T15:43:53.000Z"
          },
          {
            "Value": "Value 4",
            "EndDT": null
          }
        ]
      }
    ]
  },
  {
    "Items": [
      {
        "Key": "Key1",
        "Values": [
          {
            "Value": "Value 5",
            "EndDT": null
          }
        ]
      },
      {
        "Key": "Key4",
        "Values": [
          {
            "Value": "Value 3",
            "EndDT": "2024-01-31T15:43:53.000Z"
          },
          {
            "Value": "Value 4",
            "EndDT": null
          }
        ]
      }
    ]
  }
]

当我使用聚合检索集合时,我需要结果:

{
        $match: {
            'Items': {
                $elemMatch: {
                    'Key': 'Key1',
                    'Values': {
                        $elemMatch: {
                            'EndDT': null
                        }
                    }
                }
            }
        }
    },

结果应如下所示:

[
  {
    "Items": [
      {
        "Key": "Key1",
        "Values": [
           {
              "Value": "Value 2",
              "EndDT": null
           }
        ]
      }
    ]
  },
  {
    "Items": [
      {
        "Key": "Key1",
        "Values": [
           {
              "Value": "Value 5",
              "EndDT": null
           }
        ]
      }
    ]
  }
]

我需要显示 Values EndDT 为空的项目中的值。

这是自动生成的回复

mongodb aggregation-framework
1个回答
0
投票

即使像这样使用

$elemMatch
有效,您也只能获得外部元素,其中包括具有“EndDT”非空日期的值。

要获取匹配的数组“Items”并且仅获取“Items.Value”的匹配子数组:

  1. 展开项目,然后展开值
  2. 对 Key 和 EndDT 执行
    $match
  3. $group
    将它们放回一起,一次用于值,然后用于键。

这里唯一的要求是每个 Item 的 Key 应该是唯一的。否则,在

$group
期间,它们将位于同一个“Values”数组中:

db.collection.aggregate([
  {
    $match: {
      "Items.Key": "Key1"
    }
  },
  { $unwind: "$Items" },
  { $unwind: "$Items.Values" },
  {
    $match: {
      "Items.Key": "Key1",
      "Items.Values.EndDT": null
    }
  },
  {
    $group: {
      _id: {
        _id: "$_id",
        Key: "$Items.Key"
      },
      Values: { $push: "$Items.Values" }
    }
  },
  {
    $group: {
      _id: "$_id._id",
      Items: {
        $push: {
          Key: "$_id.Key",
          Values: "$Values"
        }
      }
    }
  }
])

蒙戈游乐场

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