【问题标题】:Mongoose aggregate output formatMongoose 聚合输出格式
【发布时间】:2017-07-02 15:09:00
【问题描述】:

我的聚合中有以下管道:

$group: {
    _id: {
        $dateToString: {
            format: '%Y-%m-%d',
            date: '$created_at'
        }
    },
    num: {
        $sum: 1
    }
}

这会返回按数据分组的文档总和,如下所示:

[
    {
        "_id": "2015-04-21",
        "num": 1871
    }
]

现在我想把输出改成这样:

[
    ["2015-04-21", 1871]
]

这在聚合管道中可行吗?还是我必须自己写转换方法?

【问题讨论】:

    标签: node.js mongodb mongoose


    【解决方案1】:

    您可以在管道中使用$addToSet$setUnion 运算符,如下所示:

    db.collection.aggregate([
        {
            "$group": {
                "_id": {
                    "$dateToString": {
                        "format": "%Y-%m-%d",
                        "date": "$created_at"
                    }
                },
                "num": {
                    "$sum": 1
                }
            }
        },
        {
            "$group": {
                "_id": "$_id",
                "A": {
                    "$addToSet": "$_id"
                },
                "B": {
                    "$addToSet": "$num"
                }
            }
        },
        {
            "$project": {
                "_id": 0,
                "finalArray": {
                    "$setUnion": [ "$A", "$B" ]
                }
            }
        }
    ]);
    

    输出

    /* 0 */
    {
        "result" : [ 
            {
                "finalArray" :  ["2015-04-21", 1871]
            }
        ],
        "ok" : 1
    }
    

    【讨论】:

    • 这正是我想要的,mongo 能做的事情给我留下了深刻的印象。
    • @woutr_be 实际上,还有 MapReduce 操作,虽然速度较慢,但​​它使用原生 JavaScript 函数进行 map 和 reduce 操作。
    • 也许这是一个完全独立的问题,但假设我的架构如下所示:pastebin.com/3eMDkysM。是否可以先按searchId 分组,然后按created_at 分组?像这样的东西:pastebin.com/EYLBdDUA
    • @woutr_be 如果您可以将其作为一个新问题发布,那就太好了,因为它非常有趣。不要忘记在问题中包含一些示例文档和预期结果。
    • 我将链接到帮助我解决此问题的答案:stackoverflow.com/questions/17062992/…。从本质上讲,使用多个组可以让我得到那个输出。
    猜你喜欢
    • 2020-02-01
    • 1970-01-01
    • 2018-08-01
    • 2016-08-01
    • 2015-05-18
    • 2017-04-26
    • 2018-01-30
    • 2016-06-09
    • 1970-01-01
    相关资源
    最近更新 更多