mongodb 日期分组聚合_mongoose聚合aggregate按日期分组计算
簡(jiǎn)介
在MongoDB中,聚合(aggregate)主要用于進(jìn)行處理數(shù)據(jù),比如統(tǒng)計(jì)求和,求平均數(shù)等,并返回計(jì)算后的數(shù)據(jù)結(jié)果,這給我們帶來了很多便捷之處,因?yàn)榭梢栽谧x取數(shù)據(jù)的同時(shí)進(jìn)行數(shù)據(jù)處理。
場(chǎng)景介紹
在日常開發(fā)環(huán)境中經(jīng)常涉及到數(shù)據(jù)報(bào)表,需要根據(jù)年月日對(duì)數(shù)據(jù)進(jìn)行統(tǒng)計(jì),下面我將簡(jiǎn)單介紹如何根據(jù)日期(yyyy-MM-dd)對(duì)營(yíng)業(yè)額進(jìn)行分組,并計(jì)算其當(dāng)天的收入。
數(shù)據(jù)結(jié)構(gòu)
Order表數(shù)據(jù)如下:
{
"_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"),
}
可以看出上面數(shù)據(jù)有兩條2016-07-01以及一條2016-07-02,現(xiàn)在讓我們來聚合出我們想要的結(jié)果。
代碼實(shí)現(xiàn)
var shop = req.shop; //店鋪數(shù)據(jù)
//聚合
Order.aggregate([
{
$match: {
"shop": shop._id //獲取shop字段為shop._id,如同find
}
},
{
$project : {
day : {$substr: [{"$add":["$created_at", 28800000]}, 0, 10] },//時(shí)區(qū)數(shù)據(jù)校準(zhǔn),8小時(shí)換算成毫秒數(shù)為8*60*60*1000=288000后分割成YYYY-MM-DD日期格式便于分組
"price": 1 //設(shè)置原有price字段可用,用于計(jì)算總價(jià)
},
},
{
$group: {
_id:"$day", //將_id設(shè)置為day數(shù)據(jù)
totalPrice:{$sum: "$price"}, //統(tǒng)計(jì)price
}
},
{
$sort: {_id: 1}//根據(jù)date排序
}
]).exec(function (err, turnover){//返回結(jié)果
console.log(turnover);
});
代碼解讀
$match用于匹配滿足條件的文檔,如同find函數(shù)。
$project用于指示字段是否輸出以及字段輸出控制。
$substr與$add,一個(gè)是分割操作,另一個(gè)相加操作。不難發(fā)現(xiàn)我們的原始數(shù)據(jù)created_at字段是具體到秒,因此如果想根據(jù)日期進(jìn)行分割的話,那么需要將created_at分割成我們想要的日期格式,這其中需要特別注意的是mongoodb存儲(chǔ)的數(shù)據(jù)是按照世界時(shí)存儲(chǔ)的,因此進(jìn)行分割操作時(shí)候需要對(duì)時(shí)間進(jìn)行時(shí)區(qū)校正,因此需使用$add加上時(shí)區(qū)差8小時(shí)(毫秒數(shù))才能得到正確的數(shù)據(jù),最后一步便是利用$group進(jìn)行分組了。
細(xì)心的小伙伴可以會(huì)發(fā)現(xiàn)aggregate自帶日期操作$year,$month,$dayOfMonth用于獲取年,月,日,會(huì)想著通過這三個(gè)參數(shù)來拼裝成yyyy-MM-dd日期格式,可惜,fidding之前也是這么操作的,只是最后發(fā)現(xiàn)appregate并解析不了,故在此使用了$substr分割方法。
$group分組以及統(tǒng)計(jì),其中_id對(duì)應(yīng)值便是我們所需分組的字段數(shù)據(jù),totalPrice則是用$sum對(duì)同組數(shù)據(jù)的字段price進(jìn)行求和,并將結(jié)果存放于totalPrice中。
$sum字段求和。
$sort排序。
結(jié)果返回
上面聚合結(jié)果turnover的值如下
[
{_id: "2016-07-01", totalPrice: 30},
{_id: "2016-07-02", totalPrice: 5}
]
正如我們所需要的,我們得到了按日期分組而成的當(dāng)天收入總價(jià)。
happy coding!
總結(jié)
以上是生活随笔為你收集整理的mongodb 日期分组聚合_mongoose聚合aggregate按日期分组计算的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python顺序控制语句_Python学
- 下一篇: python拷贝是什么知识点_pytho