列出属于不同文档的 MongoDB 聚合管道中的值

List values in MongoDB aggregation pipeline belonging to different documents

我从聚合管道中得到了这个结果:

{
    "_id" : ISODate("2015-05-14T08:22:09.441Z"),
    "values" : {
        "v1_min" : 15.872267760931187,
        "v1" : 15.909139078185774,
        "v1_max" : 20.6420184124931776
    }
},
{
    "_id" : ISODate("2015-05-13T08:22:09.441Z"),
    "values" : {
        "v1_min" : 2.872263320931187,
        "v1" : 7.909132898185774,
        "v1_max" :44.6498764124931776
    }
},
{...}

你认为有没有可能得到这样的结构

{
        "_id" : [ISODate("2015-05-14T08:22:09.441Z"),ISODate("2015-05-13T08:22:09.441Z")]
        "values" : {
            "v1_min" : [15.872267760931187, 2.872263320931187],
            "v1" : [15.909139078185774, 7.909132898185774]
            "v1_max" : [2.6420184124931776, 44.6498764124931776]
        }
}

要将其他一些阶段添加到我的聚合管道中吗?

如果是,你会怎么做?

我不想通过代码处理这个问题,因为我认为 MongoDB 聚合框架更快,应该比我做得更好。

是的,确实很有可能。以下聚合管道将实现所需的输出:

db.collection.aggregate([
    {
        "$group": {
            "_id": null,
            "ids": {
                "$addToSet": "$_id"
            },
            "v1_min": {
                "$push": "$values.v1_min"
            },
            "v1": {
                "$push": "$values.v1"
            },
            "v1_max": {
                "$push": "$values.v1_max"
            }
        }
    },
    {
        "$project": {
            "_id": "$ids",
            "values": {
                "v1_min": "$v1_min",
                "v1": "$v1",
                "v1_max": "$v1_max"
            }
        }
    }
]);

-- 编辑 --

使用 $push instead of $addToSet 因为后者只会在且仅当最终数组不包含元素本身时才添加元素。 (感谢@SylvainLeroux 的积极贡献)