mongodb集团在月份的一部分日期

时间:2016-12-02 01:06:37

标签: mongodb

我有以下数据。我想运行一个查询,按类别和月份对结果进行分组,然后返回总数。

第一个所需的输出是月份名称的嵌套数组,按类别列出所有12个月的总计。数据中不存在的月份仍将返回,但总数为0。

{"category":"Auto","month":{"Jan":9.12,"Feb":9.12,"Mar":0,...}},
{"category":"Fees","month":{..."Apr":0,"May":4.56,"Jun":0,...}},
{"category":"Travel","month":{..."Oct":0,"Nov":4.56,"Dec":0}}

第二个所需的输出是一个没有嵌套月份的数组......

{"category":"Auto","Jan":4.56,"Feb":4.56,"Mar":0,...},
{"category":"Fees",..."Apr":0,"May":4.56,"Jun":0,...},
{"category":"Travel",..."Oct":0,"Nov":0,"Dec":4.56,}

如何使用Mongodb查询这些结果?以下是示例输入数据:

{
    "_id" : ObjectId("583f6e6d14c8042dd7c153f1"),
    "transid" : 1,
    "category": "Auto",
    "postdate" : ISODate("2016-01-28T05:00:00.000Z"),
    "total" : 4.56 }

{
    "_id" : ObjectId("583f6e6d14c8042dd7c153f2"),
    "transid" : 5,
    "category": "Auto",
    "postdate" : ISODate("2016-01-31T05:00:00.000Z"),
    "total" : 4.56 }

{
    "_id" : ObjectId("583f6e6d14c8042dd7c153f3"),
    "transid" : 3,
    "category": "Auto",
    "postdate" : ISODate("2016-02-28T05:00:00.000Z"),
    "total" : 4.56 }

{
    "_id" : ObjectId("583f6e6d14c8042dd7c153f4"),
    "transid" : 2,
    "category": "Auto",
    "postdate" : ISODate("2016-02-31T05:00:00.000Z"),
    "total" : 4.56 }

{
    "_id" : ObjectId("583f6e6d14c8042dd7c153f5"),
    "transid" : 6,
    "category": "Fees",
    "postdate" : ISODate("2016-05-16T05:00:00.000Z"),
    "total" : 4.56 }

{
    "_id" : ObjectId("583f6e6d14c8042dd7c153f6"),
    "transid" : 7,
    "category": "Travel",
    "postdate" : ISODate("2016-11-13T05:00:00.000Z"),
    "total" : 4.56 }

我是mongodb的新手,来自sql背景,所以我觉得我一直在用SQL术语来思考这一切。

以下是我迄今为止尝试过的基于阅读mongodb文档并尝试翻译" sql think"。我基本上试图过滤到指定年份(在本例中为2016年)。然后我按类别和日期进行分组。在最后一步中,我计划将项目和$ cond关键字用于" subaggregate"在月份,通过指定每个月的开始和结束日期,然后将月份名称分配为Jan,Feb等...我有语法错误,我不知道这是正确的还是最好的方法。

db.transactions.aggregate(
    [
     { $match: { "postdate": {$gte: new Date("2016-01-01")}} },
     { $group: { _id: {"category":"$category","postdate":"$postdate"} , "total": { $sum: "$debit" } } },
     { $project: {"_id":0,"category":"$_id.category",
        "month":{$cond: { 
                            $and: 
                                [
                                  { $gte: ["$_id.postdate", new Date("2016-01-01")] }, 
                                  { $lt:  ["$_id.postdate", new Date("2016-02-01")] }, 
                                ] 
                            },"Jan":"$sum"}
                 //repeat for all other 11 months...
     }}
    ]
)

1 个答案:

答案 0 :(得分:0)

如果您想按月分组,可以使用月份运算符。例如:

db.transaction.aggregate([{$group:{_id:{ $month:"$postdate"}, "total":{$sum:1}}}])

我不确定你的项目是做什么的。