MongoDB根據時間aggregate樣本

來源:互聯網
上載者:User

標籤:group   aggregate   彙總管道   

需要對下面的集合根據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})


本文出自 “SQL Server Deep Dive” 部落格,請務必保留此出處http://ultrasql.blog.51cto.com/9591438/1861003

MongoDB根據時間aggregate樣本

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.