你们可以帮我解决以下问题吗?我正在尝试为我正在处理的应用程序修改以下代码段。
MongoClient.connect(url, function(err, db) {
assert.equal(null, err);
db.collection(collection).aggregate(
{
$match : {Id: uniqueKey}
},
{ $unwind : '$' + docToUnwind },
{
$project: {
_id: 1,
groupA: ('$' + docToUnwind + '.' + cashFlowField),
groupB: ('$' + docToUnwind + '.' + cashFlowDateField),
groupC: ('$Invoices.TotalAmt')
}
},
{
$match : {
groupB: { $lte: new Date(endDate),
$gte: new Date(beginDate) }
}
},
{
$project: {
groupA: 1,
groupC: 1,
buckets: {
"yr" : {"$year" : "$groupB"},
"mo" : {"$month" : "$groupB"}
},
}
},
{
$group: {
_id: "$buckets",
balance: {$sum:'$groupA'},
total: {$sum:'$groupC'}
}
},
function(err, result) {
if (result) {
callback(result);
} else {
callback(false);
}
}
);
});
输出:
[ { _id: { yr: 2016, mo: 4 }, balance: 10, total: 10 },
{ _id: { yr: 2016, mo: 11 }, balance: 20, total: 20 },
{ _id: { yr: 2016, mo: 9 }, balance: 30, total: 30 },
{ _id: { yr: 2016, mo: 7 }, balance: 40, total: 40 },
{ _id: { yr: 2016, mo: 5 }, balance: 50, total: 50 },
{ _id: { yr: 2016, mo: 6 }, balance: 60, total: 60 },
{ _id: { yr: 2017, mo: 2 }, balance: 70, total: 70 } ]
有没有办法可以修改上面的代码,将上述结果聚合成季度(或更通用 - 任何频率)桶?我正在寻找的预期产出是:
[ { _id: { qtr: Q1}, balance: 120, total: 120 },
{ _id: { qtr: Q2}, balance: 70, total: 70 },
{ _id: { qtr: Q3}, balance: 20, total: 20 },
{ _id: { qtr: Q4}, balance: 70, total: 70 }]
其他信息:
年:2016年,mo:4,5,6将落入第一桶 年:2016年,mo:7,8,9将落入第二桶 年:2016年,莫:10年,11年和年:2017年:0:0将落入第三桶 年:2017年,莫:1,2,3将落入第四桶。
样本文件,其中,
cashFlowField =" Balance&#34 ;; cashFlowDateField =" CreateDate&#34 ;;
{
"Id" : "2",
"DocNumber" : "1002",
"CreatedDate" : ISODate("2016-04-07T00:00:00.000Z"),
"CustomerRef" : {
"value" : "22",
"name" : "EdgeLink, LLC"
},
"DueDate" : ISODate("2016-04-01T00:00:00.000Z"),
"TotalAmt" : 1950,
"Balance" : 1950,
"MetaData" : {
"CreateTime" : ISODate("2016-03-10T00:45:50.000Z"),
"LastUpdatedTime" : ISODate("2016-03-10T00:45:50.000Z")
}
},
编辑: 我也尝试使用$ in运算符实现以下代码是徒劳的。我不确定这里出了什么问题。
db.collection.aggregate([
{$project:{"date":1,
"quarter":{$cond:[{$in:[{$month:"$CreatedDate"},[4,5,6]},
"first",
{$cond:[{$in:[{$month:"$CreatedDate"},[7,8,9]},
"second",
{$in:[{$lte:[{$month:"$CreatedDate"}, [10,11,0]},
"third",
"fourth"]}]}]}}},
{$group:{"_id":{"quarter":"$quarter"},"results":{$push:"$date"}}}
])
先谢谢你的帮助!:)