我用一個簡單的例子來解釋我的 mongodb 集合看起來像這樣,[
{
pid: erwer,
qty: 3,
LevelDetails: {
level1: { userId: 1, amount: 10 },
level2: { userId: 2, amount: 20 },
level3: { userId: 3, amount: 13 },
}
},
{
pid: qwsdfg,
qty: 1,
LevelDetails: {
level1: { userId: 1, amount: 10 },
level2: { userId: 4, amount: 20 },
level3: { userId: 3, amount: 13 },
}
},
]
從集合中,我需要每個用戶的級別 1、級別 2 和級別 3 的總和。查詢結果應如下所示 [
{ userId1: { TotalLevel1Amount: 20, TotalLevel2Amount: 0, TotalLevel3Amount: 0 } },
{ userId2: { TotalLevel1Amount: 0, TotalLevel2Amount: 20, TotalLevel3Amount: 0 } },
{ userId3: { TotalLevel1Amount: 0, TotalLevel2Amount: 0, TotalLevel3Amount: 26 } },
{ userId4: { TotalLevel1Amount: 0, TotalLevel2Amount: 20, TotalLevel3Amount: 0 } }
]
uj5u.com熱心網友回復:
$set:_levelDetails通過轉換LevelDetails為鍵值對添加新欄位。$unwind: 解構_levelDetails陣列。$group: 分組_levelDetails.v.userId并$sum有條件地基于級別 (_levelDetails.k)。$project: 格式化顯示的檔案。$sort(可選):按userID升序排序。
db.collection.aggregate([
{
$set: {
_levelDetails: {
$objectToArray: "$LevelDetails"
}
}
},
{
$unwind: "$_levelDetails"
},
{
$group: {
_id: "$_levelDetails.v.userId",
"TotalLevel1Amount": {
$sum: {
$cond: [
{
"$eq": [
"$_levelDetails.k",
"level1"
]
},
"$_levelDetails.v.amount",
0
]
}
},
"TotalLevel2Amount": {
$sum: {
$cond: [
{
"$eq": [
"$_levelDetails.k",
"level2"
]
},
"$_levelDetails.v.amount",
0
]
}
},
"TotalLevel3Amount": {
$sum: {
$cond: [
{
"$eq": [
"$_levelDetails.k",
"level3"
]
},
"$_levelDetails.v.amount",
0
]
}
}
}
},
{
$project: {
_id: 0,
userId: "$_id",
TotalLevel1Amount: 1,
TotalLevel2Amount: 1,
TotalLevel3Amount: 1
}
},
{
$sort: {
userId: 1
}
}
])
示例 Mongo Playground
鍵值對:
{ 'userId': { // Result } }
步驟 1 到 3 與之前的解決方案相同。
$sort(可選):按_id升序排序。$project:顯示帶有array欄位的檔案(帶有屬性k和v)。$replaceRoot:將整個檔案替換為鍵 (userId) 和值 (結果)。
db.collection.aggregate([
{
$set: {
_levelDetails: {
$objectToArray: "$LevelDetails"
}
}
},
{
$unwind: "$_levelDetails"
},
{
$group: {
_id: "$_levelDetails.v.userId",
"TotalLevel1Amount": {
$sum: {
$cond: [
{
"$eq": [
"$_levelDetails.k",
"level1"
]
},
"$_levelDetails.v.amount",
0
]
}
},
"TotalLevel2Amount": {
$sum: {
$cond: [
{
"$eq": [
"$_levelDetails.k",
"level2"
]
},
"$_levelDetails.v.amount",
0
]
}
},
"TotalLevel3Amount": {
$sum: {
$cond: [
{
"$eq": [
"$_levelDetails.k",
"level3"
]
},
"$_levelDetails.v.amount",
0
]
}
}
}
},
{
$sort: {
_id: 1
}
},
{
$project: {
array: [
{
k: {
$toString: "$_id"
},
v: {
TotalLevel1Amount: "$TotalLevel1Amount",
TotalLevel2Amount: "$TotalLevel2Amount",
TotalLevel3Amount: "$TotalLevel3Amount"
}
}
]
}
},
{
"$replaceRoot": {
newRoot: {
$arrayToObject: "$array"
}
}
}
])
示例 Mongo Playground(到鍵值對)
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/353831.html
上一篇:命名cookie不存在
