MongoDB查询求助:匹配两个数组对应索引值的文档
解决MongoDB数组对应索引匹配的查询需求
嘿,这个需求我之前做业务的时候刚好碰到过!MongoDB确实没有直接提供“数组对应索引位置匹配”的现成运算符,但咱们可以用$expr结合几个数组操作符来实现这个逻辑,完全不需要复杂的聚合管道(当然如果需要更复杂的处理也可以扩展)。
先明确下你的需求:要找出这样的文档——在item1和item2两个数组的相同索引位置上,要么item1[i] = 1且item2[i]属于[2,4],要么item1[i] = 3且item2[i]属于[3,5],对吧?
直接可用的查询语句
如果只需要至少有一个索引位置满足配对条件,可以用这个查询:
db.yourCollection.find({ $expr: { $anyElementTrue: { $map: { input: { $range: [0, { $size: "$item1" }] }, // 生成数组的所有索引 as: "i", in: { $or: [ // 第一组配对:item1[i]是1,且item2[i]在[2,4] { $and: [ { $eq: [{ $arrayElemAt: ["$item1", "$$i"] }, 1] }, { $in: [{ $arrayElemAt: ["$item2", "$$i"] }, [2, 4]] } ] }, // 第二组配对:item1[i]是3,且item2[i]在[3,5] { $and: [ { $eq: [{ $arrayElemAt: ["$item1", "$$i"] }, 3] }, { $in: [{ $arrayElemAt: ["$item2", "$$i"] }, [3, 5]] } ] } ] } } } } })
关键部分解释
$range: [0, { $size: "$item1" }]:生成从0到item1数组长度的索引列表,比如item1长度是2的话,就会生成[0,1],这样就能遍历每个位置;$map:遍历每个索引i,对item1[i]和item2[i]做条件检查,返回一个布尔值数组(每个位置是否满足配对条件);$anyElementTrue:只要布尔数组里有一个true,就说明文档符合要求,返回该文档。
拓展场景
如果你的需求是所有索引位置都必须满足配对条件(比如item1的每个元素要么是1对应item2的[2,4],要么是3对应item2的[3,5]),只需要把$anyElementTrue换成$allElementsTrue即可。
另外,如果担心item1和item2数组长度不一致导致索引越界,可以先加个长度相等的校验:
db.yourCollection.find({ $expr: { $and: [ { $eq: [{ $size: "$item1" }, { $size: "$item2" }] }, // 确保两个数组长度相同 { $anyElementTrue: { // 上面的map逻辑不变 } } ] } })
内容的提问来源于stack exchange,提问作者Zillon
相关产品推荐
相关产品推荐

