我对聚合有一些问题,我有一个集合。我有下面的类似代码的集合。因此,我有一个现场呼叫 dueDate 与当前日期 2018-11-16 进行比较。我需要通过比较当前日期和 dueDate 剩余剩余总金额 而不比较 duDate < / strong>和 dueDate 小于或等于发生日期,并从剩余的第二秒 totalSecondAmount 中查找仅 dueDate 当前日期
let myCollection=
{
"_id" : "001-29",
"tranType" : "Bill",
"tranDate" : ISODate("2018-11-16T14:55:16.621+07:00"),
"vendorId" : "001-2",
"dueDate" : ISODate("2018-11-17T14:55:16.621+07:00"),
"remaining" : 45,
"branchId" : "001",
},
/* 2 */
{
"_id" : "001-26",
"tranType" : "Bill",
"tranDate" : ISODate("2018-11-15T14:22:48.138+07:00"),
"vendorId" : "001-9",
"withdrawal" : 0,
"remaining" : 90,
"branchId" : "001",
"memo" : null,
},
/* 3 */
{
"_id" : "001-18",
"tranType" : "Bill",
"tranDate" : ISODate("2018-11-08T14:18:36.543+07:00"),
"vendorId" : "001-1",
"billDate" : ISODate("2018-11-15T14:18:36.543+07:00"),
"dueDate" : ISODate("2018-11-15T14:18:36.543+07:00"),
"remaining" : 450,
"memo" : null
},
我想要下面的结果
"lowerDueTotalRemaining" : 540,
"overDueTotalRemaining" : 45
答案 0 :(得分:0)
我们可以使用aggregation pipeline获得所需的结果。
管线阶段$project和$group与管线运算符$sum和$cond一起使用
在给定的集合中,必须执行条件以查找给定的文档是过期还是过期,以下查询的第一部分将文档分为过期和欠期。为了方便我们在下一个阶段进行分组,我在OverDue中添加了标记“ O”,在LowerDue中添加了标记“ L”。
db.collection_name.aggregate([
{
$project: {
summation: {
$cond: {
if: {
$gte: ["$dueDate", new Date("2018-11-16")]
},
then: {
overDueTotalRemaining: { $sum: "$remaining" },
flag: "O"
},
else: {
lowerDueTotalRemaining: { $sum: "$remaining" },
flag: "L"
}
}
}
}
},
{
$group: {
_id: "$summation.flag",
lowerDueTotalRemaining: {
$sum: "$summation.lowerDueTotalRemaining"
},
overDueTotalRemaining: {
$sum: "$summation.overDueTotalRemaining"
}
}
},
{
$project: {
ans: {
$cond: {
if: {
$eq: [ "$_id", "O" ]
},
then: {
"overDueTotalRemaining": "$overDueTotalRemaining"
},
else: {
"lowerDueTotalRemaining": "$lowerDueTotalRemaining"
}
}
}
}
}
]);
与我们在执行上述查询时获得的一些额外属性的匹配答案如下所示
{ "_id" : "L", "ans" : { "lowerDueTotalRemaining" : 540 } }
{ "_id" : "O", "ans" : { "overDueTotalRemaining" : 45 } }