Mongodb 使用$group聚合两次

Mongodb 使用$group聚合两次,mongodb,mongodb-query,aggregation-framework,Mongodb,Mongodb Query,Aggregation Framework,我读过这么多书和类似的问题。但是我无法生成我想要的查询 假设我有以下数据结构: { "CAUG" : "id1", "action" : "actionA", "date" : ISODate("2017-01-01"), "hp" : 16 } { "CAUG" : "id1", "action" : "actionB", "date" : ISODate("2017-01-01"), "hp" : 17 } {

我读过这么多书和类似的问题。但是我无法生成我想要的查询

假设我有以下数据结构:

{ 
    "CAUG" : "id1", 
    "action" : "actionA", 
    "date" : ISODate("2017-01-01"), 
    "hp" : 16
}
{ 
    "CAUG" : "id1", 
    "action" : "actionB", 
    "date" : ISODate("2017-01-01"), 
    "hp" : 17
}
{ 
    "CAUG" : "id1", 
    "action" : "actionC", 
    "date" : ISODate("2017-02-10"), 
    "hp" : 18
}
{ 
    "CAUG" : "id2", 
    "action" : "actionX", 
    "date" : ISODate("2018-01-01"), 
    "hp" : 20
}...
所需的输出类似(不确定括号和其他内容……):

目前,我(非常有限)的查询是:

(我试过很多方法,比如复合
\u id
,但我总是在某个时候被绊倒)

问题是我不知道如何在
时间线
数组中执行另一个
$group
。。。我被下面的输出搞砸了。。。有什么线索吗?祝你周末愉快

{ 
    "_id" : "1", 
    "timeline" : [
        {
            "CAUG" : "ca220491-ug43816", 
            "action" : "actionA", 
            "date" : ISODate("2016-12-21T23:00:00.000+0000")
        }, 
        {
            "CAUG" : "ca220491-ug43816", 
            "action" : "actionB", 
            "date" : ISODate("2016-12-21T23:00:00.000+0000")
        }, 
        {
            "CAUG" : "ca220491-ug43816", 
            "action" : "actionC", 
            "date" : ISODate("2017-02-21T23:00:00.000+0000")
        }
    ]
}

尝试运行以下聚合操作:

db.collection.aggregate([
    {
        "$group": {
            "_id": {
                "CAUG": "$CAUG",
                "date": {
                    "$dateToString": {
                        "format": "%Y-%m-%d", 
                        "date": "$date"
                    }
                }
            },
            "docs": {
                "$push": {
                    "action" : "$action",
                    "hp" : "$hp"
                }
            }                
        }
    },
    {
        "$group": {
            "_id": "$_id.CAUG",
            "timeline": {
                "$push": {
                    "date": "$_id.date",
                    "docs": "$docs"
                }
            }
        }
    }
])
它给出了示例输出

/* 1 */
{
    "_id" : "id1",
    "timeline" : [ 
        {
            "date" : "2017-02-10",
            "docs" : [ 
                {
                    "action" : "actionC",
                    "hp" : 18.0
                }
            ]
        }, 
        {
            "date" : "2017-01-01",
            "docs" : [ 
                {
                    "action" : "actionA",
                    "hp" : 16.0
                }, 
                {
                    "action" : "actionB",
                    "hp" : 17.0
                }
            ]
        }
    ]
}

/* 2 */
{
    "_id" : "id2",
    "timeline" : [ 
        {
            "date" : "2018-01-01",
            "docs" : [ 
                {
                    "action" : "actionX",
                    "hp" : 20.0
                }
            ]
        }
    ]
}

使用聚合框架,不可能在您想要的输出中返回结果,即将
时间线
数组元素作为散列键。最好将它们作为具有适当键/值对的嵌入文档。感谢您的回复。这就是我说的“我不确定括号和其他东西”(即散列与键/值…)!如果可以的话,我如何使用嵌入式文档和正确的键/值对呢?太好了!谢谢!!
db.collection.aggregate([
    {
        "$group": {
            "_id": {
                "CAUG": "$CAUG",
                "date": {
                    "$dateToString": {
                        "format": "%Y-%m-%d", 
                        "date": "$date"
                    }
                }
            },
            "docs": {
                "$push": {
                    "action" : "$action",
                    "hp" : "$hp"
                }
            }                
        }
    },
    {
        "$group": {
            "_id": "$_id.CAUG",
            "timeline": {
                "$push": {
                    "date": "$_id.date",
                    "docs": "$docs"
                }
            }
        }
    }
])
/* 1 */
{
    "_id" : "id1",
    "timeline" : [ 
        {
            "date" : "2017-02-10",
            "docs" : [ 
                {
                    "action" : "actionC",
                    "hp" : 18.0
                }
            ]
        }, 
        {
            "date" : "2017-01-01",
            "docs" : [ 
                {
                    "action" : "actionA",
                    "hp" : 16.0
                }, 
                {
                    "action" : "actionB",
                    "hp" : 17.0
                }
            ]
        }
    ]
}

/* 2 */
{
    "_id" : "id2",
    "timeline" : [ 
        {
            "date" : "2018-01-01",
            "docs" : [ 
                {
                    "action" : "actionX",
                    "hp" : 20.0
                }
            ]
        }
    ]
}