如何通过Mongo聚合动态提取charges中指定索引的字符串值?
动态提取MongoDB文档中charges字段所有键的指定索引值
可以通过MongoDB聚合管道的$objectToArray、$map和$arrayToObject组合实现,无需硬编码charges的动态键名,具体实现如下:
聚合管道代码(提取连续索引,如1、2)
db.collection.aggregate([ { $addFields: { charges: { $arrayToObject: { $map: { input: { $objectToArray: "$charges" }, as: "charge", in: { k: "$$charge.k", v: { $join: [ { $slice: [ { $split: ["$$charge.v", ","] }, 1, // 起始索引 2 // 提取元素数量(对应索引1、2) ] }, "," ] } } } } } } } ])
关键步骤解释
$objectToArray: "$charges":将charges的动态键值对象转换为[{k: "键名", v: "值字符串"}, ...]格式的数组,实现对所有动态键的遍历。$map遍历处理每个键值对:- 保留原键名:
k: "$$charge.k" - 处理值字符串:
$split:把逗号分隔的字符串拆分为数组$slice:从拆分后的数组中,从索引1开始提取2个元素(正好对应需求中的索引1、2)$join:将提取到的元素重新拼接为逗号分隔的字符串
- 保留原键名:
$arrayToObject:将处理后的键值对数组转回对象结构,恢复charges的原始格式。
灵活提取任意索引(如非连续的1、3)
如果需要提取的索引不是连续的,可将$slice替换为$map结合$arrayElemAt实现:
db.collection.aggregate([ { $addFields: { charges: { $arrayToObject: { $map: { input: { $objectToArray: "$charges" }, as: "charge", in: { k: "$$charge.k", v: { $join: [ { $map: { input: [1, 3], // 自定义要提取的索引列表 as: "idx", in: { $arrayElemAt: [{ $split: ["$$charge.v", ","] }, "$$idx"] } } }, "," ] } } } } } } } ])
内容的提问来源于stack exchange,提问作者phani
相关产品推荐
相关产品推荐

