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,但假设数组是动态生成的场景),可以用两种方式实现:
- 使用
$and操作符明确组合两个条件:
db.getCollection('Facilities').findOne({ $and: [ {_id: "pFkpqenxxbiFFtzrd"}, {_id: {$in: [ '2SYzj829FKnezgX3b', 'pFkpqenxxbiFFtzrd', 'Znsbs5Rzr6DopZmro' ]}} ] })
- 在同一个
_id键下组合多个操作符(更简洁):
db.getCollection('Facilities').findOne({ _id: { $eq: "pFkpqenxxbiFFtzrd", $in: [ '2SYzj829FKnezgX3b', 'pFkpqenxxbiFFtzrd', 'Znsbs5Rzr6DopZmro' ] } })
如果你的需求只是查询_id为pFkpqenxxbiFFtzrd的文档,那直接写{_id: "pFkpqenxxbiFFtzrd"}就足够了,不需要额外的$in条件。
内容的提问来源于stack exchange,提问作者Le garcon
相关产品推荐
相关产品推荐

