首页 > 解决方案 > “SelectMany” - 在 mongodb 聚合管道中等效

问题描述

鉴于以下文件:

/* 1 */
{
    "_id" : ObjectId("5f38fb2b52e28012a8f175f9"),
    "date" : "2020-08-16",
    "values" : {
        "wert1" : 5.0,
        "wert2" : 9.0
    }
}

/* 2 */
{
    "_id" : ObjectId("5f38fb2b52e28012a8f175fa"),
    "date" : "2020-08-16",
    "values" : {
        "wert1" : 3.0,
        "wert3" : 10.0
    }
}

如何将其转换为如下内容:

{ "wert1": [ { "2020-08-16": "8.0" } ] },
{ "wert2": [ { "2020-08-16": "9.0" } ] },
{ "wert3": [ { "2020-08-16": "10.0" } ] }

理论上会是:

这个“SelectMany”的运算符是什么?

标签: mongodbaggregation-frameworkaggregate

解决方案


通常$unwind会充当SelectMany. 在您的情况下,它有点复杂,因为您想按键名聚合,因此您还需要$ objectToArray和$arrayToObject运算符:

db.collection.aggregate([
    {
        $project: {
            date: 1,
            values: { $objectToArray: "$values" }
        }
    },
    { $unwind: "$values" },
    {
        $group: {
            _id: { date: "$date", key: "$values.k" },
            total: { $sum: "$values.v" }
        }
    },
    {
        $group: {
            _id: "$_id.key",
            v: { $push: { $arrayToObject: [ [ { k: "$_id.date", v: "$total" } ] ] } }
        }
    },
    {
        $replaceRoot: {
            newRoot: {
                $arrayToObject: [ [ { k: "$_id", v: "$v" } ] ]
            }
        }
    }
])

蒙戈游乐场


推荐阅读