首页 > 解决方案 > 在 MongoDB 中分组并添加到 Group

问题描述

我有一个MeterReadings如下所示的集合。

{
        "_id" : ObjectId("5fc768b33561870a262813c6"),
        "installedAppId" : "A",
        "readings" : [
                {
                        "n" : "daf43d66-6c3b-4553-80af-6a0b1cf97418:power",
                        "t" : 1606902984662,
                        "u" : "W",
                        "v" : 100
                }
        ]
}
{
        "_id" : ObjectId("5fc768c73561870a262813c7"),
        "installedAppId" : "B",
        "readings" : [
                {
                        "n" : "daf43d66-6c3b-4553-80af-6a0b1cf97418:power",
                        "t" : 1606902984662,
                        "u" : "W",
                        "v" : 200
                }
        ]
}
{
        "_id" : ObjectId("5fc768e43561870a262813c8"),
        "installedAppId" : "A",
        "readings" : [
                {
                        "n" : "daf43d66-6c3b-4553-80af-6a0b1cf97418:power",
                        "t" : 1606902984672,
                        "u" : "W",
                        "v" : 300
                }
        ]
}

我想要的输出是分组installedAppId,然后readings从所有匹配installedAppId的条目中附加一个条目。下面显示的是我的目标。

{
        "_id" : ObjectId("5fc768b33561870a262813c6"),
        "installedAppId" : "A",
         "readings" : [
                {
                        "n" : "daf43d66-6c3b-4553-80af-6a0b1cf97418:power",
                        "t" : 1606902984662,
                        "u" : "W",
                        "v" : 100
                },{
                        "n" : "daf43d66-6c3b-4553-80af-6a0b1cf97418:power",
                        "t" : 1606902984672,
                        "u" : "W",
                        "v" : 300
                }
        ]
}
{
        "_id" : ObjectId("5fc768c73561870a262813c7"),
        "installedAppId" : "B",
        "readings" : [
                {
                        "n" : "daf43d66-6c3b-4553-80af-6a0b1cf97418:power",
                        "t" : 1606902984662,
                        "u" : "W",
                        "v" : 200
                }
        ]

}

Grouping byinstalledAppId确实使用上面的数据返回两个组。

> db.MeterReadings.aggregate([ {$group: {_id: {installedAppId: "$installedAppId"}}} ])
{ "_id" : { "installedAppId" : "B" } }
{ "_id" : { "installedAppId" : "A" } }

由于每个读数都不同,尽管添加readings为另一个条目$group与查询整个数据库相同。

> db.MeterReadings.aggregate([ {$group: {_id: {installedAppId: "$installedAppId", readings: "$readings"}}} ]).pretty()
{
        "_id" : {
                "installedAppId" : "A",
                "readings" : [
                        {
                                "n" : "daf43d66-6c3b-4553-80af-6a0b1cf97418:power",
                                "t" : 1606902984672,
                                "u" : "W",
                                "v" : 10.2
                        }
                ]
        }
}
{
        "_id" : {
                "installedAppId" : "B",
                "readings" : [
                        {
                                "n" : "daf43d66-6c3b-4553-80af-6a0b1cf97418:power",
                                "t" : 1606902984662,
                                "u" : "W",
                                "v" : 10.2
                        }
                ]
        }
}
{
        "_id" : {
                "installedAppId" : "A",
                "readings" : [
                        {
                                "n" : "daf43d66-6c3b-4553-80af-6a0b1cf97418:power",
                                "t" : 1606902984662,
                                "u" : "W",
                                "v" : 10.2
                        }
                ]
        }
}

欢迎任何帮助!

标签: databasemongodbnosqlpymongo

解决方案


要么$push$addToSet似乎可以解决问题,但是为每个添加数组。如果可以只推送到一个数组会更好。

addToSet

> db.MeterReadings.aggregate([{$group : {_id : "$installedAppId", readings: {$addToSet : "$readings"}}}]).pretty()
{
        "_id" : "B",
        "readings" : [
                [
                        {
                                "n" : "daf43d66-6c3b-4553-80af-6a0b1cf97418:power",
                                "t" : 1606902984672,
                                "u" : "W",
                                "v" : 200
                        }
                ]
        ]
}
{
        "_id" : "A",
        "readings" : [
                [
                        {
                                "n" : "daf43d66-6c3b-4553-80af-6a0b1cf97418:power",
                                "t" : 1606902984672,
                                "u" : "W",
                                "v" : 300
                        }
                ],
                [
                        {
                                "n" : "daf43d66-6c3b-4553-80af-6a0b1cf97418:power",
                                "t" : 1606902984672,
                                "u" : "W",
                                "v" : 100
                        }
                ]
        ]
}

> db.MeterReadings.aggregate([{$group : {_id : "$installedAppId", readings: {$push: "$readings"}}}]).pretty()
{
        "_id" : "B",
        "readings" : [
                [
                        {
                                "n" : "daf43d66-6c3b-4553-80af-6a0b1cf97418:power",
                                "t" : 1606902984672,
                                "u" : "W",
                                "v" : 200
                        }
                ]
        ]
}
{
        "_id" : "A",
        "readings" : [
                [
                        {
                                "n" : "daf43d66-6c3b-4553-80af-6a0b1cf97418:power",
                                "t" : 1606902984672,
                                "u" : "W",
                                "v" : 100
                        }
                ],
                [
                        {
                                "n" : "daf43d66-6c3b-4553-80af-6a0b1cf97418:power",
                                "t" : 1606902984672,
                                "u" : "W",
                                "v" : 300
                        }
                ]
        ]
}

推荐阅读