Py学习  »  MongoDB

按条件比较MongoDB中的总和到期日和当前日期?

Aneat Tea • 4 年前 • 380 次点击  

我对聚合有一些问题,我有一个集合。我有下面这样的集合代码。所以我有一个现场电话 决斗 与当前日期比较 2018~11-16 . 我需要剩余价值的总和 当前日期 具有 决斗 剩余总额 比较没有 杜迪特 决斗 小于或等于 咖喱枣 又一秒 剩余的第二笔总额 只找到 决斗 更大的 当前日期

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
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/41261
 
380 次点击  
文章 [ 1 ]  |  最新文章 4 年前
Clement Amarnath
Reply   •   1 楼
Clement Amarnath    5 年前

我们可以使用 aggregation pipeline 才能得到想要的结果。

管道阶段 $project $group 与管道操作员一起使用 $sum $cond

在给定的托收中,必须执行一个条件来确定给定的文档是否过期或过期,下面查询的第一部分将文档分为过期和过期。为了便于下一阶段的分组,我添加了一个标记“O”表示过期,添加了“L”表示Lowerdue。

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