此版本的文档已存档,不再提供支持。要升级5.0部署,请参阅 MongoDB 6.0升级程序。
$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 比较顺序。
示例
创建 inventory 集合:
db.inventory.insertMany( [ { "item": "Pens", "quantity": 350, "tags": [ "school", "office" ] }, { "item": "Erasers", "quantity": 15, "tags": [ "school", "home" ] }, { "item": "Maps", "tags": [ "office", "storage" ] }, { "item": "Books", "quantity": 5, "tags": [ "school", "storage", "home" ] } ] )
选择不匹配的文档
以下查询从 inventory 集合中选择 quantity 不等于 5 或 15 的所有文档。
该查询还匹配没有 quantity 字段的文档。
db.inventory.find( { quantity: { $nin: [ 5, 15 ] } }, { _id: 0 } )
示例输出:
{ item: 'Pens', quantity: 350, tags: [ 'school', 'office' ] }, { item: 'Maps', tags: [ 'office', 'storage' ] }
选择不在数组中的元素
对于没有 "school" 标签的文档,将 exclude 字段设置为 true。
db.inventory.updateMany( { tags: { $nin: [ "school" ] } }, { $set: { exclude: true } } )
updateMany() 还会在文档不包含 $nin 所匹配的字段时选择该文档。
不等于运算符 $nin 的选择性不高,因为它通常匹配索引的很大一部分。因此,在许多情况下,带有索引的 $nin 查询的性能可能并不优于必须扫描集合中所有文档的 $nin 查询。另请参阅查询选择性。