如何通过MongoDB聚合将display嵌套结构转换为指定扁平键值对结构
实现思路
你可以通过单阶段$set聚合操作完成转换,核心逻辑是拆分原display数组的三部分分别处理后再合并,其他原有字段会自动保留无需额外处理。
完整聚合管道代码
db.collection.aggregate([ { $set: { display: { $concatArrays: [ // 处理前两个固定元素,替换第一个元素的键名 [ { "SQL commands": { $getField: { input: { $arrayElemAt: ["$display", 0] }, field: "SQL commands that triggered the attack:" } } }, { $arrayElemAt: ["$display", 1] } ], // 处理第三部分的嵌套二维数组,转成日期为键的对象 { $map: { input: { $arrayElemAt: ["$display", 2] }, as: "item", in: { $arrayToObject: [ [ { k: { $getField: { input: { $arrayElemAt: ["$$item", 0] }, field: "ISODate" } }, v: { $arrayElemAt: ["$$item", 1] } } ] ] } } } ] } } } ])
低版本兼容方案
如果你使用的MongoDB版本低于5.0(不支持$getField操作符),可以用$objectToArray + $first的组合替换取值逻辑:
- 第一个元素的取值替换为:
{ $first: { $objectToArray: { $arrayElemAt: ["$display", 0] } }.v } - 日期字段的取值替换为:
{ $first: { $objectToArray: { $arrayElemAt: ["$$item", 0] } }.v }
内容的提问来源于stack exchange,提问作者user7191645
相关产品推荐
相关产品推荐

