为何使用$not反转MongoDB查询条件会得到不同结果?
为什么MongoDB中两个看似等价的查询返回结果不同?
我在测试MongoDB查询时发现,以下两个查询返回的结果不一致,想知道原因:
- 第一个查询
db.collection.find({ "key": { $gte: 88 } })
- 第二个查询(使用
$not反转条件)
db.collection.find({ "key": { "$not": { $lt: 88 } } })
通常字段为数组时,仅需一个元素匹配即可满足条件,但第二个查询中似乎需所有数组元素匹配。
样本数据集:
[{ "key": [87,88] },{ "key": [88,89] },{ "key": [86,90] },{ "key": [93,89,71] }]
问题解析
这是因为MongoDB对数组字段的两种查询逻辑存在本质差异:
直接使用比较操作符(如
$gte)
当条件直接作用于数组字段时,MongoDB的匹配规则是数组中只要存在至少一个元素满足条件,整个文档就会被返回。所以第一个查询会命中所有包含≥88元素的文档,也就是样本里的全部4条数据。使用
$not包裹比较操作符$not是对整个字段的匹配结果取反。对于数组字段来说,{key: {$lt:88}}的匹配规则是数组中存在至少一个元素小于88,那么$not反转后,就变成数组中不存在任何元素小于88——也就是要求数组里的所有元素都≥88。所以第二个查询只会返回{"key": [88,89]}这一条数据。
简单总结:
- 直接用比较符:任意元素满足条件 → 文档匹配
$not+比较符:所有元素都不满足原条件 → 文档匹配
内容的提问来源于stack exchange,提问作者Minh Nghĩa
相关产品推荐
相关产品推荐

