【问题标题】:MongoDB aggregation: average sales per hourMongoDB聚合:每小时平均销售额
【发布时间】:2018-10-31 23:15:51
【问题描述】:

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

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

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

【问题讨论】:

    标签: mongodb aggregation-framework


    【解决方案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"}
      }}
    ])
    

    【讨论】:

    • 安东尼说得对。这将返回所有小时的平均值。
    • 答案对你有用吗?如果有效,请考虑接受,
    • 感谢@Veeram,但我没有得到预期的结果。 {"_id" : null,"salesPerHour" : 339.153846153846}
    • Np 预期的 json 输出是什么?哪个领域有销售价值?
    • 类似:[{"_id" : 8,"salesPerHour" : 11}, {"_id" : 9,"salesPerHour" : 5}, {"_id" : 10,"salesPerHour" : 15},...]。其中 _id 是一天中的小时。基本上我需要获得一天中每个小时的平均销售额。
    【解决方案2】:

    你可以试试下面的聚合

    您必须将$avg 聚合运算符与salesPerHour 字段一起使用

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

    【讨论】:

    • 从我的角度来看,它应该可以工作,但不确定 salesPerHour 字段包含什么
    • salesPerHour 这不是一个集合字段。使用你的例子我得到salesPerHour=null
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-10
    • 1970-01-01
    • 2016-03-26
    • 2021-07-23
    相关资源
    最近更新 更多