Docs 菜单

$ne

$ne

$ne 选择指定字段的值不等于指定值的文档。这包括不包含指定字段的文档。

有关不同BSON类型值的比较,请参阅指定的BSON比较顺序。

可以使用 $ne 查找托管在以下环境中的部署:

$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 的子字段。该操作使用 $setfee 值不等于 1fee 子字段不存在的每个文档中的 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 文档,此外还有 nutswashers 文档:

[
{
_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 }
}
]