日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

mongodb 日期分组聚合_mongoose聚合aggregate按日期分组计算

發(fā)布時(shí)間:2024/1/23 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mongodb 日期分组聚合_mongoose聚合aggregate按日期分组计算 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

簡(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。