MongoDB:使用动态字段名称在嵌套对象中搜索最小值,最大值

Sha*_*ams 5 mongodb mongodb-query aggregation-framework

我有一个查询来获取minimum querymaximum query下面的示例数据集.在我的情况下,字段名称是动态的,如下所示product_1,product_2...

{
    "_id" : NumberLong(540),
    "product_1" : {
            "orderCancelled" : 0,
            "orderDelivered" : 6
    },
    "product_2" : {
            "orderCancelled" : 3,
            "orderDelivered" : 16
    },
    "product_3" : {
            "orderCancelled" : 5,
            "orderDelivered" : 11
    }
}
Run Code Online (Sandbox Code Playgroud)

我没有得到一个想法,我怎么能做到这一点蒙戈其中的字段名是动态的,意味着未来可能有其他的产品也得到创建为product_4product_5为同一id.

我需要一个查询,它给出了最小值orderDelivered和最大值orderCancelled,例如在上面的文档中结果将是orderDelivered:16&orderCancelled:0.
谢谢你的想法.

Dmy*_*nko 2

您应该重组您的文档,以便所有产品文档都位于一个数组中:

{
    "_id": NumberLong(540),
    products: [
        {
            "name": "product_1",
            "orderCancelled": 0,
            "orderDelivered": 6
        },
        {
            "name": "product_2",
            "orderCancelled": 3,
            "orderDelivered": 16
        },
        {
            "name": "product_3",
            "orderCancelled": 5,
            "orderDelivered": 11
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

然后您将能够发出正常的最大/最小查询,如下所示:

db.test.aggregate([
    {   
        $match: { "_id" : NumberLong(540) }
    },
    {
        $unwind: "$products"
    },
    {
        $group: {
            _id: "$_id",
            minDelivered: { $min: "$products.orderDelivered" },
            maxCancelled: { $max: "$products.orderCancelled" }
        }
    }
])
Run Code Online (Sandbox Code Playgroud)

  • @user3100115 必须使用单独的工具更改现有数据。我相信讨论这样的工具不是这里的主题。 (2认同)
  • 感谢@DmytroShevchenko,这个设计解决了我的问题。:-) (2认同)