在汇总mongodb中按条件比较到期日与当前日期的总和?

时间:2018-11-16 08:39:09

标签: javascript mongodb aggregate

我对聚合有一些问题,我有一个集合。我有下面的类似代码的集合。因此,我有一个现场呼叫 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

1 个答案:

答案 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 } }