MongoDB聚合管道中如何根据array2元素获取其在array1中的索引
当然可以实现这个需求!你只需要结合MongoDB的$map和$indexOfArray两个操作符就能搞定,$map刚好能帮你遍历数组里的每一个元素,然后对每个元素执行$indexOfArray操作。
具体实现代码
直接上聚合管道的写法,你可以直接套用:
db.collection.aggregate([ { $addFields: { indexArray: { $map: { input: "$array2", as: "currentItem", in: { $indexOfArray: ["$array1", "$$currentItem"] } } } } } ])
代码解释
我给你拆解开讲清楚每一步:
$addFields:用来在原有文档基础上新增一个indexArray字段,专门存我们要的索引结果$map的input参数指定要遍历的目标数组,这里就是你要处理的$array2as是给遍历到的每个元素起的别名,这里叫currentItem,注意引用这个别名的时候要加$$前缀(MongoDB的语法要求)in部分就是核心逻辑:对每个$$currentItem,调用$indexOfArray去$array1里找它的索引位置
测试验证
用你给出的示例文档:
输入文档:
{array1: ["a", "b", "c"]}, {array2: ["c", "a", "b"]}
执行完上面的聚合管道后,新增的indexArray字段值就是[2, 0, 1],完全符合你的预期。
额外补充
如果array2里有元素不在array1中,$indexOfArray会返回-1。要是你需要处理这种场景,可以结合$cond做判断替换,比如把-1换成null或者其他默认值,举个例子:
in: { $cond: { if: { $ne: [{ $indexOfArray: ["$array1", "$$currentItem"] }, -1] }, then: { $indexOfArray: ["$array1", "$$currentItem"] }, else: null } }
内容的提问来源于stack exchange,提问作者uuu
相关产品推荐
相关产品推荐

