mongoDB按日期聚合和另一个字段

时间:2014-02-18 00:48:05

标签: node.js mongodb aggregation-framework

我正在尝试按日期字段运行聚合并提供id字段。我有以下代码,它生成每月查看的所有优惠的总和。

db.useroffers.aggregate(

    {$project: {date: {
        month: {$month: "$viewdate"},
        year: {$year: "$viewdate"},
    }}},
    {$limit: {offer_id: {$in: [101,102,103,104,105,106]}}},
    {$group: {_id: {offer_id: "$offer_id", date: "$date"}, views: {$sum: 1}}}
)

但是,我需要按$ month- $ year分组,并显示每个优惠的总和,以及有限的offer_ids。

1 个答案:

答案 0 :(得分:0)

使用示例文档时问题会更好,但是大多数情况下,您似乎已经混淆了一些条款。

首先$project用于重新整理管道中的文档。当您日期结构更改为所需内容时,您已省略了稍后要在其他管道阶段中使用的其他字段。包含隐式的唯一其他字段是_id。因此,您需要明确声明所需的字段。

其次$limit仅采用单个数字参数,表示要保留的集合中的文档数。如果你正在测试一个非常大的源并想要一个子集直到你的整个管道完成,或者在你想要返回一定数量的条目之后对最终结果进行排序之后,通常只有这个才有意义。

对于您尝试在此处执行的选择,您需要$match运算符,您可以按照尝试匹配一组offer_id值。

db.useroffers.aggregate(
    // Match first
    {$match: {offer_id: {$in: [101,102,103,104,105,106]}}},

    // Change the document. You could also do this in group
    {$project: {
        date: {
            month: {$month: "$viewdate"},
            year: {$year: "$viewdate"},
        },
        offer_id: 1,
        views: 1
    }},

    // Group by "date" and "offer_id"
    {$group: {
        _id: { date: "$date", offer_id: "$offer_id"},
        views: {$sum: 1}
    }},

    // Nicer output
    {$project: {
        _id: 0,
        date: {$concat: [
            {$substr: ["$_id.date.month", 0, 2]},
            "-",
            {$substr: ["$_id.date.year", 0, 4]}
        ]},
        offer_id: "$_id.offer_id,
        views: 1
    }}
)