MongoDB 4.2 聚合操作如何为数组元素添加原始位置索引字段
MongoDB 4.2 聚合管道为数组元素添加索引字段方案
实现逻辑
你可以在现有聚合管道的末尾追加对应阶段,为数组元素添加标识原始位置的index字段,核心逻辑是生成和原数组等长的索引序列,再将索引和对应元素合并。
具体实现代码
假设你现有聚合管道输出的数组字段名为dataArr,可替换为你实际使用的字段名:
db.collection.aggregate([ // 此处为你已完成的原有聚合管道逻辑,最终输出包含目标数组的字段 // 以下为新增的追加阶段 { $addFields: { dataArr: { $map: { input: { $zip: { inputs: [ "$dataArr", { $range: [0, { $size: "$dataArr" }] } ] } }, as: "itemPair", in: { $mergeObjects: [ { $arrayElemAt: ["$$itemPair", 0] }, { index: { $arrayElemAt: ["$$itemPair", 1] } } ] } } } } }, // 如果需要将数组拆分为独立文档输出,可追加以下两个阶段,不需要可直接删除 { $unwind: "$dataArr" }, { $replaceRoot: { newRoot: "$dataArr" } } ])
代码说明
$range运算符基于原数组长度生成从0开始的连续整数序列,和原数组元素位置一一对应$zip运算符将原数组元素和索引序列按位置配对,得到[原元素, 索引值]的配对数组$map遍历所有配对,通过$mergeObjects将索引字段合并到原元素对象中,最终得到带index字段的数组
该方案所有用到的运算符均兼容MongoDB 4.2版本,后续你对文档进行任意排序操作后,都可以通过index字段查询到元素在原始数组中的位置。
内容的提问来源于stack exchange,提问作者Iago Coutinho Campos
相关产品推荐
相关产品推荐

