說明:我有幾份檔案,我想根據typ并列出name和date_key。最后我們有一份檔案,那就算了typ。請查看預期輸出。
評論
typvalue 是一個變數。它只會計算變數值的出現。datakey 包含一個元素,例如只是日期。但是我們需要鍵作為值,鍵可以是多個,目前有2個鍵,我可以3個或更多。看到預期的輸出鍵顯示為串列["el1", "el2]
[
{
"typ": "ABC",
"data": [
{
"name": "XYZ",
"in_data": {
"date": {
"el2": "2015-01-10",
"el1": "2014-01-10"
},
"version" : "0.22",
"model" : "2015"
}
}
]
},
{
"typ": "ABC",
"data": [
{
"name": "LMNO",
"in_data": {
"date": {
"el2": "2015-01-10",
"el1": "2014-01-10"
},
"version" : "0.22",
"model" : "2014"
}
}
]
},
{
"typ": "EDC",
"data": [
{
"name": "QWERTY",
"in_data": {
"date": {
"el3": "2015-01-10",
"el4": "2014-01-10"
},
"version" : "0.52",
"model" : "2010"
}
}
]
}
]
預期產出
[
{
"typ_count" : 2,
"name" : ["XYZ", "LLMNO"],
"date_key" : ["el1", "el2"]
},
{
"typ_count" : 1,
"name" : ["QWERTY"],
"date_key" : ["el3", "el4"]
},
]
uj5u.com熱心網友回復:
鑒于該data欄位是一個僅包含 ONE 元素的陣列,您只需使用$unwind,$first或$arrayElemAt運算子將其展平,但建議使用最后兩個運算子中的任何一個以實作最佳聚合管道操作。
您的聚合管道基本上應該有 4 個階段:初始階段是將密鑰轉換($addFields管道)data到嵌入檔案,因為它作為陣列的設計是多余的,因為它只有一個元素,最好將其展平以使其成為嵌入檔案。
下一個管道應該是另一個轉換操作,您可以在其中使用$map并$objectToArray創建date鍵串列。
從那里您需要$group檔案來聚合typ_countusing$sum并創建另一個date鍵串列以及nameusing 串列$push。
最終管道使用and$reduce過濾掉上面生成的 date_key 串列中的重復項。$concatArrays$cond
您的整體管道應如下所示
db.collection.aggregate([
{ $addFields: {
data: { $arrayElemAt: ['$data', 0] } // OR data: { $first: '$data' }
} },
{ $addFields: {
name: '$data.name',
date_key: {
$map: {
input: { $objectToArray: '$data.in_data.date' },
in: '$$this.k'
}
}
} },
{ $group: {
_id: '$typ',
typ_count: { $sum: 1 },
name: { $push: '$name' },
date_key: { $push: '$date_key' }
} },
{ $project: {
_id: 0,
typ_count: 1,
name: 1,
date_key: {
$reduce: {
input: '$date_key',
initialValue: [],
in: {
$concatArrays: [
'$$value',
{
$cond: [
{ $in: ["$$this", ["$$value"]] },
[],
"$$this"
]
}
]
}
}
}
} }
])
蒙戈游樂場
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/440577.html
