MongoDB聚合:将起止范围合并为对象数组的实现方案
解决方案
修改你的聚合查询,在$group阶段直接将每个文档的startRange和endRange组合成对象,再统一收集到range数组中,具体代码如下:
const getUsedRanges = await MyCode.aggregate([ { $group: { _id: "$prefixStr", range: { $push: { start: "$startRange", end: "$endRange" } } } } ]).exec();
说明
原查询的问题在于$group阶段把startRange和endRange分别存入两个独立数组,无法保证每个start和end的对应关系。修改后:
- 在
$group中,用$push将每个文档的startRange和endRange封装成{start, end}对象 - 所有同
prefixStr的对象会被收集到range数组中,直接得到你需要的结构
如果需要对range数组按start字段排序(比如让ABCD的范围按start从小到大排列),可以添加一个$addFields阶段:
const getUsedRanges = await MyCode.aggregate([ { $group: { _id: "$prefixStr", range: { $push: { start: "$startRange", end: "$endRange" } } } }, { $addFields: { range: { $sortArray: { input: "$range", sortBy: { start: 1 } } } } } ]).exec();
内容的提问来源于stack exchange,提问作者Aks
相关产品推荐
相关产品推荐

