收藏
{
"_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' } } }
]
非常感谢任何帮助实现预期的产出。
答案 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"
}
}
}])
对于其余的事情,您可能需要进行应用程序端解析以生成您想要的输出