mongodb聚合获取所有字段按日期汇总

时间:2017-11-21 15:00:15

标签: mongodb aggregation-framework

收藏

{
    "_id" : ObjectId("5a143a79ca78479b1dc90161"),
    "createdAt" : ISODate("2017-11-21T14:38:49.375Z"),
    "amount" : 227.93359186,
    "pair" : "ant_eth"
}

预期输出

{
  "12-12-2012": [
    {
     "pair": "ant_eth",
     "sum": "sum of amounts in 12-12-2012"
    },
    {
     "pair": "new_pair",
     "sum": "sum of amounts in 12-12-2012"
    },
  ],
  "13-12-2012": [{
    "pair": "ant_eth",
    "sum": "sum of amounts in 13-12-2012"
  }]
}

到目前为止,我所知道的是,

const criteria = [
  { $group: { 
    _id: '$pair', 
    totalAmount: { $sum: '$amount' } } }
]

非常感谢任何帮助实现预期的产出。

2 个答案:

答案 0 :(得分:2)

好的,所以你想只按日期时间和日期的日期部分来总结金额,然后"组织"所有的对+按日期求和。你可以通过"重新组合"如下。第一个$group会创建总和,但会留下重复的日期。第二个$group将输出修复为几乎所需的输出,除了日期保留为_id的rvals而不是成为lvals(字段名称)本身。

db.foo.aggregate([
  {
    $group: {
      _id: {d: {$dateToString: { format: "%Y-%m-%d", date: "$createdAt"}}, pair: "$pair"}, 
       n: {$sum: "$amount"}
    }
  },
  {
    $group: {
      _id: "$_id.d", 
      items: {$push: {pair: "$_id.pair", sum: "$n"}} 
    }
  }
]);

如果您真的想拥有字段名称,请在第二个$group之后添加这两个阶段:

,{$project: {x: [["$_id","$items"]] }}
,{$replaceRoot: { newRoot: {$arrayToObject: "$x"} }}

答案 1 :(得分:0)

这是我能得到的:

db.collection.aggregate([{
    $group: {
        _id: {
            year: {
                "$year": "$createdAt"
            },
            month: {
                "$month": "$createdAt"
            },
            day: {
                "$dayOfMonth": "$createdAt"
            },
            pair: "$pair"
        },
        sum: {
            $sum: "$amount"
        }
    }
}])

对于其余的事情,您可能需要进行应用程序端解析以生成您想要的输出