You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 09:02:52