此行为是预期的,并在 mongo 文档中进行了解释here http://docs.mongodb.org/manual/reference/method/db.collection.find/#query-a-field-that-contains-an-array.
查询包含数组的字段
如果字段包含数组并且您的查询有多个条件
运算符,如果单个数组,则整个字段将匹配
元素满足条件or 数组元素的组合
满足条件.
Mongo 似乎愿意“自鸣得意”,当数组元素的组合独立匹配所有条件时返回结果。
在我们的示例中,5 匹配 $lt:20 条件,25 匹配 $gt:10 条件。所以,这是一场比赛。
以下两者都将返回 [5,25] 结果:
db.collection.find({ x: {$gt: 10, $lt: 20} })
db.collection.find({ $and : [{x: {$gt: 10}},{x:{ $lt: 20}} ] })
如果这是用户预期的行为,意见可能会有所不同。但这肯定是有记录的,并且应该是可以预料到的。
Edit,对于尼尔对原始答案的虐待狂但具有高度教育意义的编辑,寻求解决方案:
使用$elemMatch http://docs.mongodb.org/manual/reference/operator/query/elemMatch/可以进行“更严格”的元素比较仅数组.
db.collection.find({ x: { $elemMatch:{ $gt:10, $lt:20 } } })
Note:这将匹配 x:[11,12]andx:[11,25]
我相信当需要这样的查询时,可以结合使用two需要查询,并将结果合并。下面是一个查询,它返回 x 为的文档的正确结果不是数组:
db.collection.find( { $where : "!Array.isArray(this.x)", x: {$gt: 10, $lt: 20} } )
但最好的办法在本例中是将 x 的类型更改为always是一个数组,即使它只包含一个元素。然后,只需要 $elemMatch 查询即可获得正确的结果和预期的行为。