mongodb 日期分组聚合_mongoose聚合aggregate按日期分组计算
簡介
在MongoDB中,聚合(aggregate)主要用于進行處理數據,比如統計求和,求平均數等,并返回計算后的數據結果,這給我們帶來了很多便捷之處,因為可以在讀取數據的同時進行數據處理。
場景介紹
在日常開發環境中經常涉及到數據報表,需要根據年月日對數據進行統計,下面我將簡單介紹如何根據日期(yyyy-MM-dd)對營業額進行分組,并計算其當天的收入。
數據結構
Order表數據如下:
{
"_id" : ObjectId("578c7cf8c2b8941e375a1178"),
"price" : 10,
"shop" : ObjectId("57751e70d35e816989656eb3"),
"created_at" : ISODate("2016-07-01T06:53:44.148Z"),
},
{
"_id" : ObjectId("578c7cf8c2b8941e375a2345"),
"price" : 20,
"shop" : ObjectId("57751e70d35e816989656eb3"),
"created_at" : ISODate("2016-07-01T07:50:24.242Z"),
},
{
"_id" : ObjectId("5778d62630cc9e92a723c370"),
"price" : 5,
"shop" : ObjectId("57751e70d35e816989656eb3"),
"created_at" : ISODate("2016-07-02T09:08:54.656Z"),
}
可以看出上面數據有兩條2016-07-01以及一條2016-07-02,現在讓我們來聚合出我們想要的結果。
代碼實現
var shop = req.shop; //店鋪數據
//聚合
Order.aggregate([
{
$match: {
"shop": shop._id //獲取shop字段為shop._id,如同find
}
},
{
$project : {
day : {$substr: [{"$add":["$created_at", 28800000]}, 0, 10] },//時區數據校準,8小時換算成毫秒數為8*60*60*1000=288000后分割成YYYY-MM-DD日期格式便于分組
"price": 1 //設置原有price字段可用,用于計算總價
},
},
{
$group: {
_id:"$day", //將_id設置為day數據
totalPrice:{$sum: "$price"}, //統計price
}
},
{
$sort: {_id: 1}//根據date排序
}
]).exec(function (err, turnover){//返回結果
console.log(turnover);
});
代碼解讀
$match用于匹配滿足條件的文檔,如同find函數。
$project用于指示字段是否輸出以及字段輸出控制。
$substr與$add,一個是分割操作,另一個相加操作。不難發現我們的原始數據created_at字段是具體到秒,因此如果想根據日期進行分割的話,那么需要將created_at分割成我們想要的日期格式,這其中需要特別注意的是mongoodb存儲的數據是按照世界時存儲的,因此進行分割操作時候需要對時間進行時區校正,因此需使用$add加上時區差8小時(毫秒數)才能得到正確的數據,最后一步便是利用$group進行分組了。
細心的小伙伴可以會發現aggregate自帶日期操作$year,$month,$dayOfMonth用于獲取年,月,日,會想著通過這三個參數來拼裝成yyyy-MM-dd日期格式,可惜,fidding之前也是這么操作的,只是最后發現appregate并解析不了,故在此使用了$substr分割方法。
$group分組以及統計,其中_id對應值便是我們所需分組的字段數據,totalPrice則是用$sum對同組數據的字段price進行求和,并將結果存放于totalPrice中。
$sum字段求和。
$sort排序。
結果返回
上面聚合結果turnover的值如下
[
{_id: "2016-07-01", totalPrice: 30},
{_id: "2016-07-02", totalPrice: 5}
]
正如我們所需要的,我們得到了按日期分組而成的當天收入總價。
happy coding!
總結
以上是生活随笔為你收集整理的mongodb 日期分组聚合_mongoose聚合aggregate按日期分组计算的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python顺序控制语句_Python学
- 下一篇: 增量索引和全量索引_搜索引擎(七)高可用