mongodb汇总非重复计数

时间:2018-08-22 01:37:11

标签: mongodb-query aggregation-framework

意识到这个主题已经问了很多遍了-但是这些建议并没有帮助我解决这个问题。

以下查询试图使用ISODay确定给定工作日的销售情况。因为该查询将在每月的月初运行,所以我需要知道该月份发生了多少次特定的ISOday。

var query = { eventType: 'Sale', site : 4, tank: 1, txnDate : { "$gt" : new Date('2018-08-01T00:00:00') } };

db.tankevent.aggregate([
          { $match: query },
          { $project : { 
              isoDay: { $isoDayOfWeek: "$txnDate" },
              dayDate: { $dateToString: { format: "%d", date:"$txnDate" } }
              } 
          },
          { $group: 
              { _id : { isoday: "$isoDay", dday: "$dayDate" }, count: { "$sum" : 1 } }
          },
          { $sort: { "_id.isoday": 1, "_id.dday": 1 } }

 ]) 

提供以下输出

/* 1 */
{
    "_id" : {
        "isoday" : 1,
        "dday" : "06"
    },
    "count" : 62.0
}

/* 2 */
{
    "_id" : {
        "isoday" : 1,
        "dday" : "13"
    },
    "count" : 69.0
}

/* 3 */
{
    "_id" : {
        "isoday" : 1,
        "dday" : "20"
    },
    "count" : 72.0
}

/* 4 */
{
    "_id" : {
        "isoday" : 2,
        "dday" : "07"
    },
    "count" : 75.0
}

我试图用“ count”表示唯一的“ dday”记录的数量-因此,使用上面的输出,我希望isoDay = 1的计数为“ 3”。目前,计数是报告销售事件的数量组合发生的事情

1 个答案:

答案 0 :(得分:0)

您需要做的就是分组两次。

db.tankevent.aggregate([
      { $match: query },
      { $project : { 
          isoDay: { $isoDayOfWeek: "$txnDate" },
          dayDate: { $dateToString: { format: "%d", date:"$txnDate" } }
          } 
      },
      { $group: 
          { _id : { isoday: "$isoDay", dday: "$dayDate" }, count: { "$sum" : 1 } }
      },
      { $project : { 
          isoDay_Final: "$_id.isoday"    
          } 
      },
      { $group: 
          { _id : "$isoDay_Final", count: { "$sum" : 1 } }
      },
      { $sort: { "_id": 1 } }
 ])