默认情况下仅从前一个月平均获取Mongo结果

时间:2018-09-04 09:59:20

标签: mongodb mongoose mongodb-query

我在mongodb中有此数据:

 [
{

    "CreateDate" : ISODate("2018-08-08T04:53:51.840Z"),
    "cummulativeKWH" : 368.5,
     "frequency" : "50.12"
},
{

    "CreateDate" : ISODate("2018-08-08T04:53:51.840Z"),
    "cummulativeKWH" : 369.5,
     "frequency" : "50.12"
},
{

    "CreateDate" : ISODate("2018-09-03T04:53:51.840Z"),
    "cummulativeKWH" : 369.5,
     "frequency" : "50.12"
},
]

我是MongoDb的新手,希望您对此查询有所帮助。我编写了以下聚合管道。仅在使用过滤器方法和选择的日期时,我才需要取上个月的累计KWH的平均值。如何仅在默认情况下不选择且不使用过滤器的情况下,默认情况下如何仅获取上一个月的累计KWH(例如:aug 1至aug 31)的平均值。 任何人都可以建议我。

 db.collection.aggregate([
  { "$match": {
    'createDate': {'$gte':ISODate("2018-08-01"), '$lte':ISODate("2018-08-31") } 
  }},
  {$group: {_id:null,
   cummulative: {$avg:"$cummulativeKWH"}
}}
])

我正在尝试这种聚合,但我得到了输出,但是如何在没有日期选择和过滤器的情况下如何获取默认的前一个月平均数据。

1 个答案:

答案 0 :(得分:1)

从3.6版本开始

您必须从日期中提取年份和月份。 尝试以下聚合

db['02'].aggregate(
    [
        // Stage 1
        {
            $match: {
                $expr: {$and:[
                  {$eq:[{$year:"$CreateDate"},{$year:new Date()}]},
                  {$eq:[1,{$subtract:[{$month:new Date()},{$month:"$CreateDate"}]}]},  
                ]}
            }
        },

        // Stage 2
        {
            $group: {
            _id:{year:{$year:"$CreateDate"},month:{$month:"$CreateDate"}},
                    avg : {$avg:"$cummulativeKWH"}

            }
        },
    ],
);

3.6版之前的 您可以使用$ redact stage:

db ['02']。aggregate(

// Pipeline
[
    // Stage 1
    {
        $group: {
        _id:{year:{$year:"$CreateDate"},month:{$month:"$CreateDate"}},
                avg : {$avg:"$cummulativeKWH"},       
        }
    },

    // Stage 2
    {
        $redact: {
          $cond: {  if: { $and:[
            {$eq: [ "$_id.year", {$year:new Date()} ]}, 
            {$eq: [-1, {$subtract:[ "$_id.month", {$month:new Date()} ]}]}
            ]},
                  then: "$$KEEP",
                  else: "$$PRUNE"
          }
        }
    },
],

);

结果:

{ 
    "_id" : {
        "year" : NumberInt(2018), 
        "month" : NumberInt(8)
    }, 
    "avg" : 369.0
}