MongoDB根据时间aggregate示例
admin
2023-01-26 18:02:21
0

需要对下面的集合根据LastUpdate按天分组累加TranslateFields值。

rs_test:SECONDARY> db.new_result.find();   
{ "_id" : ObjectId("57fb0756e31f84a56ed41889"), "LastUpdate" : ISODate("2016-09-02T01:35:02.471Z"), "TranslateFields" : 9 }    
{ "_id" : ObjectId("57fb0756e31f84a56ed4188a"), "LastUpdate" : ISODate("2016-09-05T11:13:28.344Z"), "TranslateFields" : 10 }    
{ "_id" : ObjectId("57fb0756e31f84a56ed4188b"), "LastUpdate" : ISODate("2016-09-05T09:26:41.016Z"), "TranslateFields" : 33 }    
{ "_id" : ObjectId("57fb0756e31f84a56ed4188c"), "LastUpdate" : ISODate("2016-09-02T13:34:50.114Z"), "TranslateFields" : 12 }    
{ "_id" : ObjectId("57fb0756e31f84a56ed4188d"), "LastUpdate" : ISODate("2016-08-26T03:49:52.369Z"), "TranslateFields" : 17 }


如果是在SQL Server里,分组统计应该像这样写:

SELECT CONVERT(varchar,LastUpdate,112),SUM(TranslateFields)
  FROM dbo.new_result
  GROUP BY CONVERT(varchar,LastUpdate,112)
  ORDER BY 1;


那么在MongoDB里,有3种聚合方法:group、aggregate和mapReduce

//2.6版本aggregate方法   
db.new_result.aggregate(    
      {    
        $group : {    
           _id : { year: { $year: "$LastUpdate" }, month: { $month: "$LastUpdate" }, day: { $dayOfMonth: "$LastUpdate" } },    
           totalTime: { $sum: "$TranslateFields" }    
        }    
      },    
      {    
        $sort : {    
           "_id.year": 1, "_id.month": 1, "_id.day": 1    
        }    
      }    
)

 

 

//3.0版本aggregate方法   
db.new_result.aggregate(    
      {    
        $group : {    
           yearMonthDay: { $dateToString: { format: "%Y-%m-%d", date: "$LastUpdate" } },    
           totalTime: { $sum: "$TranslateFields" }    
        }    
      },    
      {    
        $sort : {    
           "yearMonthDay": 1    
        }    
      }    
)

 

//group方法   
db.new_result.group({    
 keyf : function(doc){    
  var date = new Date(doc.LastUpdate);    
  var dateKey = ""+date.getFullYear()+"-"+(date.getMonth()+1)+"-"+date.getDate();    
  return {'day':dateKey};    
},     
 initial : {"time":0},     
 reduce : function(doc, prev){    
        prev.time += doc.TranslateFields;    
    },     
 finalize : function Finalize(out) {    
    return out;    
}    
}    
});
//先存为日期    
//1    
db.tmp_result.find({"value.Status":3},{"value.TranslateFields":1,"value.LastUpdate":1}).forEach(    
    function(item){    
         db.new_result.save({"LastUpdate":item.value.LastUpdate.getFullYear()+"-"+    
             (item.value.LastUpdate.getMonth()+1)+"-"+    
             item.value.LastUpdate.getDate(),    
             "TranslateFields":item.value.TranslateFields});    
    }    
 )    
//2    
db.new_result.aggregate(    
      {    
        $group : {    
           _id:"$LastUpdate",    
           totalTime: { $sum: "$TranslateFields" }    
        }    
      }    
     ,{"$sort":{"_id":1}}    
)

 

对于aggregate方法,最好在$group之前$match,减少数据量,如果过滤的键上有索引,查询也会走索引。

db.TranslateTicket.aggregate(    
{    
    "$match":    
    {    
         "LastUpdate": {"$gte":ISODate("2016-06-19T00:00:00.000Z"), "$lt":ISODate("2016-09-19T00:00:00.000Z")},    
         "Status": 3    
    }    
},    
{    
    "$group":    
    {    
      _id : { month: { $month: "$LastUpdate" }, day: { $dayOfMonth: "$LastUpdate" }, year: { $year: "$LastUpdate" } },    
     totalTime: { $sum: "$CharactersCount" }    
    }    
},    
{    
    "$sort":    
    {    
        "_id.year":1,"_id.month":1,"_id.day":1    
    }    
}    
)

 

这种情况,最好在创建如下索引:

db.TranslateTicket.createIndex({“LastUpdate”:1,”Status”:1},{background:1})


相关内容

热门资讯

德国总理:美国正在被伊朗羞辱 德国之声4月27日报道,德国总理默茨在访问一所学校时表示,在当前的持续冲突中,伊朗领导层正试图羞辱美...
理响中国|“长”歌以行,风云激... 光阴如梭,东方潮阔。这里是中国的长三角,世界的长三角。无论过去、现在还是未来,这片土地都因时代而生,...
白宫:特朗普及其国安团队开会讨... 新华社华盛顿4月27日电 美国白宫新闻秘书莱维特27日在记者会上证实,总统特朗普及其国家安全团队当天...
人民日报刊文:日本放开杀伤性武... 日本放开杀伤性武器出口推高地缘冲突风险(国际论坛)常思纯《人民日报》(2026年04月28日 第 0...
医疗保障法草案二审:明确生育保... 满足多样化健康保障需求本报记者 彭 波4月27日,医疗保障法草案二审稿提请十四届全国人大常委会第二十...
天津一景区发生自转旋翼机事故1... 澎湃新闻记者 吕新文中国民用航空华北地区管理局4月22日公布《豪客通航“10•1”天津长芦汉盐旅游区...
卡塔尔埃米尔与美国总统特朗普通... 当地时间24日,卡塔尔埃米尔塔米姆与美国总统特朗普通电话,重点就中东地区局势以及伊朗与美国谈判问题交...
男子30年前被扣押2859克黄... 澎湃新闻记者 王鑫家住辽宁省大连市的潘永嘉近日向澎湃新闻反映称,三十年前,他在大连周水子机场被盖州市...
商务部:取消反制欧盟两家金融机... 中华人民共和国商务部令二〇二六年 第1号鉴于欧盟已取消对中国两家金融机构的制裁措施,现公布《关于取消...
过去24小时共有5艘船只通过霍... 总台记者当地时间24日获悉,过去24小时内,共有5艘船只通过霍尔木兹海峡,其中包括一艘伊朗油轮。(总...