MongoDB聚合查询如何从fields与values映射数组中提取指定字段值
问题原因
你当前的写法直接将完整的values数组推入结果集合,没有根据fields数组和目标字段的映射关系提取对应位置的数值,因此输出不符合预期。
正确聚合实现
你需要在分组前先计算目标字段在fields数组中的索引,再提取values数组对应索引位置的数值,完整语句如下:
return await Metric.aggregate([ { $match: matches, }, { $sort: { _id: 1 } }, // 计算目标字段在fields数组中的索引 { $addFields: { targetIndex: { $indexOfArray: ['$fields', params.field] } } }, // 可选:过滤掉不存在目标字段的无效文档 { $match: { targetIndex: { $ne: -1 } } }, { $group: { _id: params.field, // 仅推入values数组对应索引的数值 values: { $push: { $arrayElemAt: ['$values', '$targetIndex'] } } } } ]);
逻辑说明
$indexOfArray操作符可以返回指定字段在fields数组中的位置索引,目标字段不存在时返回-1$arrayElemAt操作符可以根据索引从values数组中取出对应位置的数值- 分组阶段仅推入提取到的单值,而非整个
values数组,最终输出结构和你预期完全一致
内容的提问来源于stack exchange,提问作者Nasouh
相关产品推荐
相关产品推荐

