如何使用MongoDB和Javascript将数据聚合到季度桶中?

时间:2017-03-15 12:59:20

标签: javascript node.js mongodb amazon-web-services

你们可以帮我解决以下问题吗?我正在尝试为我正在处理的应用程序修改以下代码段。

  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"}}}
])

先谢谢你的帮助!:)

0 个答案:

没有答案