【问题标题】:mongodb aggregate distinct countmongodb聚合不同计数
【发布时间】:2018-08-22 01:37:10
【问题描述】:

意识到这个话题已经被问过很多次了 - 但这些建议并没有帮助我解决这个问题。

以下查询尝试使用 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 的 count 为“3”。目前 count 正在报告销售事件的数量发生在组组合中

【问题讨论】:

  • 发布一些示例数据。

标签: mongodb-query aggregation-framework


【解决方案1】:

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

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

【讨论】:

  • 出于某种原因,我认为我仅限于管道阶段的一个实例 - 你已经解放了我的思绪 Shravya - 谢谢
猜你喜欢
  • 1970-01-01
  • 2016-10-17
  • 1970-01-01
  • 2013-09-01
  • 2016-12-25
  • 1970-01-01
  • 2013-04-28
  • 1970-01-01
相关资源
最近更新 更多