MongoDB聚合:每小时平均销售额

时间:2018-10-31 13:12:44

标签: mongodb aggregation-framework

我有一个销售系列。现在,我需要获取日期范围内每小时的平均销售量。

到目前为止,我有这样的查询:

db.getCollection('sales').aggregate({
    "$match": {
        $and: [
            { "createdAt": { $gte: ISODate("2018-05-01T00:00:00.000Z") } },
            { "createdAt": { $lt: ISODate("2018-10-30T23:59:00.000Z") } },
        ]
    }
},{ 
    "$project": {
      "h":{"$hour":"$createdAt"},
     }
},{ 
     "$group":{ 
        "_id": "$h",
        "salesPerHour": { $sum: 1 },
      },
},{
    "$sort": { "salesPerHour": -1 }
});

结果如下:{“ _id”:15,“ salesPerHour”:681.0}

如何获取salesPerHour的平均值而不是总和?

更新1 =>示例文档。

{
    "_id" : "pX6jj7j4274J9xpSA",
    "idFiscalSale" : "48",
    "documentYear" : "2018",
    "paymentType" : "cash",
    "cashReceived" : 54,
    "items" : [...],
    "customer" : null,
    "subTotal" : 23.89,
    "taxTotal" : 3.7139,
    "total" : 23.89,
    "rewardPointsValue" : 0,
    "rewardPointsEarned" : 24,
    "discountValue" : 0,
    "createdAt" : ISODate("2018-04-24T00:00:00.201Z")
}

2 个答案:

答案 0 :(得分:1)

您可以使用以下聚合查询。

db.sales.aggregate([
  {"$match":{
    "createdAt":{
      "$gte":ISODate("2018-05-01T00:00:00.000Z"), 
      "$lt":ISODate("2018-10-30T23:59:00.000Z")
    }
  }},
  {"$group":{
    "_id":{"$hour":"$createdAt"},
    "salesPerHour":{"$sum":1}
  }},
  {"$group":{
    "_id":null,
    "salesPerHour":{"$avg":"$salesPerHour"}
  }}
])

答案 1 :(得分:1)

您可以尝试以下汇总

您必须在salesPerHour字段中使用$avg聚合运算符

db.collection.aggregate([
  { "$match": {
    "$and": [
      { "createdAt": { "$gte": ISODate("2018-05-01T00:00:00.000Z") }},
      { "createdAt": { "$lt": ISODate("2018-10-30T23:59:00.000Z") }}
    ]
  }},
  { "$group": {
    "_id": { "$hour": "$createdAt" },
    "salesPerHour": {
      "$avg": "$salesPerHour"
    }
  }}
])