定义
$ne$ne选择指定字段的值不等于指定值的文档。这包括不包含指定字段的文档。有关不同BSON类型值的比较,请参阅指定的BSON比较顺序。
兼容性
可以使用 $ne 查找托管在以下环境中的部署:
MongoDB Atlas:用于云中 MongoDB 部署的完全托管服务
MongoDB Enterprise:基于订阅、自我管理的 MongoDB 版本
MongoDB Community:源代码可用、免费使用且可自行管理的 MongoDB 版本
语法
$ne 操作符采用以下形式:
{ field: { $ne: value } }
注意
如果$ne操作符的值为 null,请参阅非相等筛选器以了解更多信息。
示例
以下示例使用 inventory 集合。要创建集合,请在 mongosh 中运行以下 insertMany() 命令:
db.inventory.insertMany( [ { item: "nuts", quantity: 30, carrier: { name: "Shipit", fee: 3 } }, { item: "bolts", quantity: 50, carrier: { name: "Shipit", fee: 4 } }, { item: "washers", quantity: 10, carrier: { name: "Shipit", fee: 1 } } ] )
匹配不相等的文档字段
选择 inventory 集合中 quantity 不等于 20 的所有文档:该查询还会选择没有 quantity 字段的文档:
db.inventory.find( { quantity: { $ne: 20 } } )
{ _id: ObjectId("61ba667dfe687fce2f042420"), item: 'nuts', quantity: 30, carrier: { name: 'Shipit', fee: 3 } }, { _id: ObjectId("61ba667dfe687fce2f042421"), item: 'bolts', quantity: 50, carrier: { name: 'Shipit', fee: 4 } }, { _id: ObjectId("61ba667dfe687fce2f042422"), item: 'washers', quantity: 10, carrier: { name: 'Shipit', fee: 1 } }
与该查询等效的 SQL 是:
SELECT * FROM INVENTORY WHERE QUANTITIY != 20
基于不相等嵌入式文档字段的更新
以下示例根据与嵌入式文档中的字段进行的 $ne 比较设置 price 字段。updateMany() 操作搜索 carrier 嵌入式文档,其中包含一个名为 fee 的子字段。该操作使用 $set 将 fee 值不等于 1 或 fee 子字段不存在的每个文档中的 price 字段更新为 9.99:
db.inventory.updateMany( { "carrier.fee" : { $ne: 1 } }, { $set: { "price": 9.99 } } )
{ _id: ObjectId("61ba66e2fe687fce2f042423"), item: 'nuts', quantity: 30, carrier: { name: 'Shipit', fee: 3 }, price: 9.99 }, { _id: ObjectId("61ba66e2fe687fce2f042424"), item: 'bolts', quantity: 50, carrier: { name: 'Shipit', fee: 4 }, price: 9.99 }, { _id: ObjectId("61ba66e2fe687fce2f042425"), item: 'washers', quantity: 10, carrier: { name: 'Shipit', fee: 1 } }
与该查询等效的 SQL 是:
UPDATE INVENTORY SET PRICE = '9.99' WHERE carrierfee != 1
不等式操作符 $ne 的选择性不是很高,因为它通常会匹配索引的很大一部分。因此,在许多情况下,带索引的 $ne查询的性能可能并不比必须扫描集合中所有文档的 $ne查询好。请参阅创建选择性查询。
数组
在比较数组时,$ne 匹配文档数组与 $ne 中指定的数组不相同的文档。具体来说,$ne 匹配这些文档中的任何一个,其中数组:
具有不同元素值或字符串
元素的顺序不同。
有不同数量的元素
是文档中缺少的
示例,以下查询返回 type大量不同于 [ "hardware", "fasteners" ] 的 inventory 个文档:
db.inventory.find( { type: { $ne: [ "hardware", "fasteners" ] } } )
以下完整示例将一个 type 数组添加到两个 inventory 文档,并使用 $ne 运行查询:
// Update the nuts document to include a type array db.inventory.updateOne( { item: "nuts" }, { $set: { type: [ "hardware" ] } } ) // Update the bolts document to include a type array db.inventory.updateOne( { item: "bolts" }, { $set: { type: [ "hardware", "fasteners" ] } } ) // Find documents where the type array differs from [ "hardware", "fasteners" ] db.inventory.find( { type: { $ne: [ "hardware", "fasteners" ] } } )
输出显示 nuts 文档,因为数组与 [
"hardware", "fasteners" ] 不同,且 washers 文档因为没有 type 数组:
[ { _id: ObjectId('679d26907c5a58595234305c'), item: 'nuts', quantity: 30, carrier: { name: 'Shipit', fee: 3 }, type: [ 'hardware' ] }, { _id: ObjectId('679d26907c5a58595234305e'), item: 'washers', quantity: 10, carrier: { name: 'Shipit', fee: 1 } } ]
以下查询将反转数组中的元素:
db.inventory.find( { type: { $ne: [ "fasteners", "hardware" ] } } )
由于 bolts 文档中的 type 数组是 [ "hardware",
"fasteners" ],这与 [ "fasteners", "hardware" ] 不同,因此查询会返回 bolts 文档,此外还有 nuts 和 washers 文档:
[ { _id: ObjectId('679d26907c5a58595234305c'), item: 'nuts', quantity: 30, carrier: { name: 'Shipit', fee: 3 }, type: [ 'hardware' ] }, { _id: ObjectId('679d26907c5a58595234305d'), item: 'bolts', quantity: 50, carrier: { name: 'Shipit', fee: 4 }, type: [ 'hardware', 'fasteners' ] }, { _id: ObjectId('679d26907c5a58595234305e'), item: 'washers', quantity: 10, carrier: { name: 'Shipit', fee: 1 } } ]
$ne 匹配数组不包含指定值的文档和不包含数组的文档。例如:
db.inventory.find( { type: { $ne: "fasteners" } } )
查询返回 nuts 文档,因为数组 [ "hardware"
] 与 "fasteners" 不同。此外,查询会返回 washers 文档,因为该文档没有 type 数组。查询输出:
[ { _id: ObjectId('679d26907c5a58595234305c'), item: 'nuts', quantity: 30, carrier: { name: 'Shipit', fee: 3 }, type: [ 'hardware' ] }, { _id: ObjectId('679d26907c5a58595234305e'), item: 'washers', quantity: 10, carrier: { name: 'Shipit', fee: 1 } } ]