定义
$ne$ne选择字段值不等于指定值的文档。这包括不包含该字段的文档。有关不同BSON类型值的比较,请参阅指定的BSON比较顺序。
兼容性
可以使用 $ne 查找托管在以下环境中的部署:
MongoDB Atlas:用于云中 MongoDB 部署的完全托管服务
MongoDB Enterprise:基于订阅、自我管理的 MongoDB 版本
MongoDB Community:源代码可用、免费使用且可自行管理的 MongoDB 版本
语法
$ne 操作符采用以下形式:
{ field: { $ne: value } }
注意
如果$ne的值为空,请参阅非等值过滤器。
示例
本页上的示例使用 sample_mflix示例数据集 中的数据。有关如何将此数据集加载到自管理MongoDB 部署中的详细信息,请参阅加载示例数据集。如果对示例数据库进行了任何修改,则可能需要删除并重新创建数据库才能运行本页上的示例。
匹配不相等的文档字段
以下示例返回 runtime 大于 1000 分钟且 rated 不等于 "G" 的电影。由于 $ne 还匹配不包含 rated字段的文档,因此即使评级数据不可用,该查询也会返回电影:
db.movies.find( { rated: { $ne: "G" }, runtime: { $gt: 1000 } }, { _id: 0, title: 1, runtime: 1, rated: 1 } )
[ { runtime: 1256, title: 'Centennial' }, { runtime: 1140, title: 'Baseball', rated: 'TV-PG' } ]
基于不相等嵌入式文档字段的更新
以下示例根据与嵌入式文档中的字段进行的$ne 比较设置 highestRated 字段。updateMany() 操作搜索 imdb 嵌入式文档,其中包含一个名为 rating 的子字段。该操作使用 $set 将rating值不等于 9.3 或rating子字段不存在的每个文档中的 highestRated 字段更新为 false:
db.movies.updateMany( { "imdb.rating": { $ne: 9.3 } }, { $set: { "highestRated": false } } )
{ acknowledged: true, insertedId: null, matchedCount: ..., modifiedCount: ..., upsertedCount: 0 }
与该查询等效的 SQL 是:
UPDATE movies SET highestRated = false WHERE imdb_rating != 9.3
不等式操作符 $ne 的选择性不是很高,因为它通常会匹配索引的很大一部分。因此,在许多情况下,带索引的 $ne查询的性能可能并不比必须扫描集合中所有文档的 $ne查询好。请参阅创建选择性查询。
数组
比较数组时,$ne 的行为会有所不同,具体取决于您传递的是标量还是数组作为比较值。
标量比较:
$ne匹配标量值未作为元素出现在数组中的文档,包括没有字段的文档。精确数组比较:
$ne匹配字段数组与指定数组不同的文档,包括具有不同元素顺序、不同元素数量或缺失字段的文档。
以下示例返回运行时超过 1000 分钟的电影来演示每个行为。
使用标量比较
以下示例返回 runtime 大于 1000 分钟且 "Drama" 不是 genres数组的电影:
db.movies.find( { genres: { $ne: "Drama" }, runtime: { $gt: 1000 } }, { _id: 0, title: 1, genres: 1 } )
[ { genres: [ 'Documentary', 'History', 'Sport' ], title: 'Baseball' } ]
使用精确数组比较
以下示例返回 runtime 大于 1000 分钟且 genres数组不完全等于 [ "Drama" ] 的电影。与标量比较不同,Centennial(与 genres: [ "Action", "Adventure", "Drama" ])会进行匹配,因为该数组与 [ "Drama" ] 不同:
db.movies.find( { genres: { $ne: [ "Drama" ] }, runtime: { $gt: 1000 } }, { _id: 0, title: 1, genres: 1 } )
[ { genres: [ 'Action', 'Adventure', 'Drama' ], title: 'Centennial' }, { genres: [ 'Documentary', 'History', 'Sport' ], title: 'Baseball' } ]