【问题标题】:Aggregating nested arrays in mongodb在 mongodb 中聚合嵌套数组
【发布时间】:2021-06-27 11:14:23
【问题描述】:

我知道我可以使用 $in 来匹配数组中的元素,但是如果数组是嵌套的呢?像这样:

{
    "_id": ObjectId("somethingsomething"),
    "supermarkets": [
        {
            "groceries": [
                {
                    "groceryType": "banana",
                    "groceryStockDate": "12345678",
                    "groceryAmount": 12
                },
                {
                    "groceryType": "cabbage",
                    "groceryStockDate": "313512",
                    "groceryAmount": 53
                },
                {
                    "groceryType": "strawberry",
                    "groceryStockDate": "51362",
                    "groceryAmount": 52
                }
            ]
        },
        {
            "groceries": [
                {
                    "groceryType": "banana",
                    "groceryStockDate": "31321",
                    "groceryAmount": 52
                },
                {
                    "groceryType": "banana",
                    "groceryStockDate": "532451",
                    "groceryAmount": 73
                },
                {
                    "groceryType": "cucumber",
                    "groceryStockDate": "123",
                    "groceryAmount": 12
                }
            ]
        }
    ]
}

在这里,我想用groceryType: banana 获取每个对象,所以最终结果应该是这样的

[
    {
        "groceryType": "banana",
        "groceryStockDate": "12345678",
        "groceryAmount": 12
    },
    {
        "groceryType": "banana",
        "groceryStockDate": "31321",
        "groceryAmount": 52
    },
    {
        "groceryType": "banana",
        "groceryStockDate": "532451",
        "groceryAmount": 73
    }
]

我特别想用聚合来做到这一点,因为我需要稍后通过更多阶段。

【问题讨论】:

    标签: mongodb mongodb-query aggregation-framework aggregate aggregation


    【解决方案1】:

    演示 - https://mongoplayground.net/p/ayerR4qQMoI

    supermarketssupermarkets.groceries 上使用$unwind 获取个人文档,使用$match 过滤数据,使用$project 获取正确形状。

    db.collection.aggregate({
      $unwind: "$supermarkets"
    },
    {
      $unwind: "$supermarkets.groceries"
    },
    {
      $match: {
        "supermarkets.groceries.groceryType": "banana"
      }
    },
    {
      $project: {
        _id: 0,
        groceries: "$supermarkets.groceries"
      }
    })
    

    【讨论】:

    • @ReturnCos 很高兴它有帮助:)
    猜你喜欢
    • 2017-07-26
    • 1970-01-01
    • 2017-07-16
    • 1970-01-01
    • 2015-12-06
    • 2020-12-18
    • 2020-01-25
    • 2021-03-19
    • 1970-01-01
    相关资源
    最近更新 更多