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

Meteor查询异常:重复_id键导致findOne结果不符合预期

为什么你的MongoDB查询返回了错误的文档?

我完全懂你之前的想法——很多人都觉得查询文档里键的顺序不影响结果,但这次的问题其实和顺序无关,而是JavaScript对象中重复键的特性在搞鬼!

问题根源

你写的查询里重复使用了_id键:

db.getCollection('Facilities').findOne({
  _id: "pFkpqenxxbiFFtzrd", 
  _id: {$in: [ '2SYzj829FKnezgX3b', 'pFkpqenxxbiFFtzrd', 'Znsbs5Rzr6DopZmro' ]}
})

在JavaScript中,当一个对象里出现重复的键时,后面的键会直接覆盖前面的。也就是说,MongoDB实际接收到的查询条件其实是:

{_id: {$in: [ '2SYzj829FKnezgX3b', 'pFkpqenxxbiFFtzrd', 'Znsbs5Rzr6DopZmro' ]}}

而findOne()方法会返回集合中第一个匹配该条件的文档,刚好你的集合里_id为2SYzj829FKnezgX3b的文档排在目标文档前面,所以就返回了它,而不是你想要的pFkpqenxxbiFFtzrd。

正确的写法

如果你想要的是:查询_id等于pFkpqenxxbiFFtzrd,同时这个_id存在于指定的数组中(虽然这里数组已经包含了目标ID,但假设数组是动态生成的场景),可以用两种方式实现:

  1. 使用$and操作符明确组合两个条件:
db.getCollection('Facilities').findOne({
  $and: [
    {_id: "pFkpqenxxbiFFtzrd"},
    {_id: {$in: [ '2SYzj829FKnezgX3b', 'pFkpqenxxbiFFtzrd', 'Znsbs5Rzr6DopZmro' ]}}
  ]
})
  1. 在同一个_id键下组合多个操作符(更简洁):
db.getCollection('Facilities').findOne({
  _id: {
    $eq: "pFkpqenxxbiFFtzrd",
    $in: [ '2SYzj829FKnezgX3b', 'pFkpqenxxbiFFtzrd', 'Znsbs5Rzr6DopZmro' ]
  }
})

如果你的需求只是查询_id为pFkpqenxxbiFFtzrd的文档,那直接写{_id: "pFkpqenxxbiFFtzrd"}就足够了,不需要额外的$in条件。

内容的提问来源于stack exchange,提问作者Le garcon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 04:08:17