MongoDB如何通过传入多组x、y值匹配查询目标文档?
解决MongoDB按多键值对数组匹配文档的问题
嘿,问题出在你使用$in的方式上!你当前的查询是在尝试让整个文档和数组里的{x,y}对象完全相等,但你的数据库文档里还有val字段,这就导致永远匹配不上——毕竟{x:10,y:20}和{x:10,y:20,val:"h"}是两个不同的对象。
下面给你两种可行的解决方案:
方法一:使用$or直接构造多条件查询
这是最直观的方式,把每个{x,y}键值对转换成一个独立的查询条件,用$or包裹起来:
// 你的目标匹配数组 const targetPairs = [{x: 10, y:20},{x: 20, y:70}]; // 转换成$or的查询条件 const query = { $or: targetPairs }; // 执行查询 db.collection('example').find(query).toArray((err, docs) => { if (err) throw err; console.log(docs); // 会输出你预期的结果 });
这个方法简单易懂,适合匹配数组长度不大的场景。
方法二:使用$expr结合$in处理动态长数组
如果你的目标匹配数组是动态生成的,或者长度比较长,可以用$expr来比较文档的x和y组合值是否在目标集合里:
const targetPairs = [{x: 10, y:20},{x: 20, y:70}]; // 将目标对转换成[x,y]数组的形式,方便在$expr中对比 const formattedTargets = targetPairs.map(pair => [pair.x, pair.y]); const query = { $expr: { $in: [ ["$x", "$y"], formattedTargets ] } }; db.collection('example').find(query).toArray((err, docs) => { if (err) throw err; console.log(docs); });
这里我们把每个文档的x和y字段组合成一个数组,然后检查这个数组是否存在于格式化后的目标数组中,同样能精准匹配到你需要的文档。
两种方法都能帮你得到预期的返回结果:
[{x: 10, y: 20, val: "h"},{x: 20, y: 70, val: "ho"}]
内容的提问来源于stack exchange,提问作者Alessandro Zago
相关产品推荐
相关产品推荐

