我有一個集合,其中資料每天根據 unix 紀元時間更新。例如:
{
"uID" : "12345678",
"midNightTimeStamp" : NumberInt(1645381800), // 21st Feb 2022 midnight IST
"energyConsumed" : NumberInt(53)
},
{
"uID" : "12345678",
"midNightTimeStamp" : NumberInt(1645641000), // 24th Feb 2022 midnight IST
"energyConsumed" : NumberInt(30)
}
現在,如果您想按月查詢過去 12 個月的資料,您會采用什么方法來解決這個問題?我所知道的是,我可以在聚合查詢中對我的資料進行分組,如下所示:
$project: {
energyConsumed: 1.0,
year: {
$year: // How would you convert this from epoch
},
month: {
$month: // How would you convert this from epoch
}
},
現在,如果我想將過去 12 個月的資料分組為這樣的
$group: {
_id: '$month',
energyConsumed: {
$sum: '$energyConsumed'
}
}
我想要的輸出將是:
{
id: 04 // (something like 04 or just April but data should be sorted month and year wise April 2021),
energyConsumed: 4179772
},
{
id: 05 // (something like 05 or just May but data should be sorted month and year wise),
energyConsumed: 6179772
},
...
...
{
id: 03 // (something like 03 or just March (March 2022),
energyConsumed: 5643772
}
uj5u.com熱心網友回復:
也許是這樣:
db.collection.aggregate([
{
$group: {
_id: {
$dateToString: {
format: "%Y-%m",
date: {
$toDate: {
"$multiply": [
"$midNightTimeStamp",
1000
]
}
}
}
},
monthlyConsumption: {
$sum: "$energyConsumed"
}
}
}
])
解釋:
$group 基于 midNightTimeStamp 欄位提取的 Year-Month ("YYYY-mm" ) 和 $sum 每月消費
操場
uj5u.com熱心網友回復:
要從現在開始僅捕捉過去 12 個月,請將其放在$group上面的舞臺前:
// Back up one year from right now:
var sdate = new ISODate();
sdate.setYear((sdate.getYear()-1) 1900);
db.foo.aggregate([
{$match: {$expr: {$gt:[{$toDate: {$multiply:['$midNightTimeStamp',1000]}},sdate]} } },
{$group: { ... // as above
uj5u.com熱心網友回復:
如果您已經運行 MongoDB 5.0 版,那么您可以使用$dateTrunc:
db.collection.aggregate([
{
$group: {
_id: {
$dateTrunc: {
date: { $toDate: { $toLong: { $multiply: ["$midNightTimeStamp", 1000] } } },
unit: "month",
timezone: "Europe/Zurich"
}
},
energyConsumed: { $sum: "$energyConsumed" }
}
}
])
它可能比$dateToString: { format: "%Y-%m" ...由于timezone選項更精確。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/440592.html
