$nin$nin选择满足以下条件的文档:指定的字段值不在指定的数组中,也不在
指定的字段不存在。
兼容性
可以使用 $nin 查找托管在以下环境中的部署:
MongoDB Atlas:用于云中 MongoDB 部署的完全托管服务
MongoDB Enterprise:基于订阅、自我管理的 MongoDB 版本
MongoDB Community:源代码可用、免费使用且可自行管理的 MongoDB 版本
语法
$nin 操作符采用以下形式:
{ field: { $nin: [ <value1>, <value2> ... <valueN> ] } }
如果field有一个数组,则 $nin 操作符会选择field 包含数组的文档,该数组中没有与指定数组中的值相等的元素。例如<value1>、<value2>等等。
关于不同 BSON 类型值的比较,请参阅指定的 BSON 比较顺序。
示例
本页上的示例使用 sample_mflix示例数据集 中的数据。有关如何将此数据集加载到自管理MongoDB 部署中的详细信息,请参阅加载示例数据集。如果对示例数据库进行了任何修改,则可能需要删除并重新创建数据库才能运行本页上的示例。
选择不匹配的文档
以下示例返回 runtime 大于 1000 分钟且 rated 不在 [ "G", "PG" ] 中的电影。由于 $nin 还匹配不包含 rated字段的文档,因此即使评级数据不可用,该查询也会返回电影:
db.movies.find( { rated: { $nin: [ "G", "PG" ] }, runtime: { $gt: 1000 } }, { _id: 0, title: 1, year: 1, rated: 1 } )
[ { title: 'Centennial', year: 1978 }, { title: 'Baseball', year: 1994, rated: 'TV-PG' } ]
选择不在数组中的元素
以下示例针对 genres数组中没有 "Drama" 的电影,将 exclude字段设置为 true:
db.movies.updateMany( { genres: { $nin: [ "Drama" ] } }, { $set: { exclude: true } } )
{ acknowledged: true, insertedId: null, matchedCount: ..., modifiedCount: ..., upsertedCount: 0 }
updateMany() 还会在文档不包含 $nin 所匹配的字段时选择该文档。
不等式操作符$nin 的选择性不高,因为它通常匹配索引的很大一部分。因此,在许多情况下,带索引的$nin查询的性能可能并不比必须扫描集合中所有文档的$nin查询好。请参阅创建选择性查询。