我還不習慣 mongoDB。
我想使用示例資料將它們制作為以下結果。我想按天找到每個欄位的總和。
即使我搜索了幾個檔案,我也找不到答案。
樣本資料
[
{
_id: 1,
parentId: 1,
'stats': {
'type': {
'a': {
'n:1': 2,
'n:2': 2
},
'b': {
'n:1': 2,
'n:2': 1,
'n:3': 1
},
'c': {
'n:5': 4
}
}
},
time: ISODate('2021-10-12T05:00:00Z')
},
{
_id: 2,
parentId: 1,
'stats': {
'type': {
'a': {
'n:1': 1,
},
'b': {
'n:1': 2,
'n:2': 3,
'n:3': 4
},
'c': {
'n:4': 2
}
}
},
time: ISODate('2021-10-12T06:00:00Z')
},
{
_id: 3,
parentId: 2,
'stats': {
'type': {
'a': {
'n:1': 3,
},
'b': {
'n:2': 5,
'n:3': 7
},
'c': {
'n:1': 1,
'n:5': 2
}
}
},
time: ISODate('2021-10-13T05:00:00Z')
}
]
結果
[
{ parentId: 1, 'n:1':7, 'n:2':6, 'n:3':5, 'n:4':2, 'n:5':4, year: '2021', month: '10', day:'12'},
{ parentId: 2, 'n:1':4, 'n:2':5, 'n:3':7, 'n:5':2, year: '2021', month: '10', day:'13'},
]
它應該按 parentId、欄位、年、月、日分組。多個欄位計數讓我很難。
請幫我。
uj5u.com熱心網友回復:
您可以通過幾種不同的方式來做到這一點,因為這里的主要需求是重組資料,以便我們可以正確地進行資料重組$group,這是我認為使用各種運算子最簡單的方法。
我會提到,如果您使用的是 5 版本,則可以簡化語法,因為他們添加了新的$getField運算子,該運算子允許您訪問物件上的特定鍵。然而,由于這個版本仍然很新,我選擇不使用它作為我的解決方案:
db.collection.aggregate([
{
$addFields: {
values: {
$reduce: {
input: {
$map: {
input: {
"$objectToArray": "$stats.type"
},
as: "typeObj",
in: {
"$objectToArray": "$$typeObj.v"
},
}
},
initialValue: [],
in: {
"$concatArrays": [
"$$this",
"$$value"
]
}
}
}
}
},
{
$unwind: "$values"
},
{
$group: {
_id: {
parentId: "$parentId",
key: "$values.k"
},
value: {
$sum: "$values.v"
},
time: {
$first: "$time"
}
}
},
{
$group: {
_id: "$_id.parentId",
values: {
$push: {
k: "$_id.key",
v: "$value"
}
},
time: {
$first: "$time"
}
}
},
{
$replaceRoot: {
newRoot: {
"$mergeObjects": [
{
parentId: "$_id"
},
{
"$arrayToObject": "$values"
},
{
year: {
$year: "$time"
}
},
{
month: {
$month: "$time"
}
},
{
day: {
"$dayOfMonth": "$time"
}
},
]
}
}
}
])
蒙戈游樂場
uj5u.com熱心網友回復:
我的建議是這個。time: { $first: "$time" }我使用的不是{ $dateTrunc: { date: "$time", unit: "day" } },它需要 MongoDB 5.0 版。
db.collection.aggregate([
{ $set: { stats: { $objectToArray: "$stats.type" } } },
{ $set: { stats: { $map: { input: "$stats.v", in: { $objectToArray: "$$this" } } } } },
{
$set: {
stats: {
$reduce: {
input: "$stats",
initialValue: [],
in: { $concatArrays: ["$$value", "$$this"] }
}
}
}
},
{ $unwind: "$stats" },
{
$group: {
_id: {
parentId: "$parentId",
day: { $dateTrunc: { date: "$time", unit: "day" } },
k: "$stats.k"
}, v: { $sum: "$stats.v" }
}
},
{
$group: {
_id: {
parentId: "$_id.parentId",
day: "$_id.day"
},
stats: { $push: { k: "$_id.k", v: "$v" } }
}
},
{ $set: { stats: { $arrayToObject: "$stats" } } },
{ $set: { "_id.day": { $dateToParts: { date: "$_id.day" } } } },
{ $replaceRoot: { newRoot: { $mergeObjects: ["$_id", "$stats"] } } },
{ $set: { year: "$day.year", month: "$day.month", day: "$day.day" } }
])
部分
{ $set: { stats: { $objectToArray: "$stats.type" } } },
{ $set: { stats: { $map: { input: "$stats.v", in: { $objectToArray: "$$this" } } } } },
{
$set: {
stats: {
$reduce: {
input: "$stats",
initialValue: [],
in: { $concatArrays: ["$$value", "$$this"] }
}
}
}
},
等于@TomSlabbaert 答案:
{
$addFields: {
values: {
$reduce: {
input: {
$map: {
input: {
"$objectToArray": "$stats.type"
},
as: "typeObj",
in: {
"$objectToArray": "$$typeObj.v"
},
}
},
initialValue: [],
in: {
"$concatArrays": [
"$$this",
"$$value"
]
}
}
}
}
},
其余的只是外觀上的差異。
蒙戈游樂場
如果您沒有運行 MongoDB 5.0 替換
day: { $dateTrunc: { date: "$time", unit: "day" } }
經過
year: { $year: "$time" },
month: { $month: "$time" },
day: { $dayOfMonth: "$time" }
并Date使用$dateFromParts()轉換回 a
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/335970.html
