Trong MongoDB, $not toán tử đường ống tổng hợp đánh giá một boolean và trả về giá trị boolean ngược lại.
Nói cách khác, khi boolean đánh giá là true , $not toán tử trả về false . Và khi boolean đánh giá thành false , $not toán tử trả về true .
Ví dụ
Giả sử chúng ta có một bộ sưu tập được gọi là tests với các tài liệu sau:
{ "_id" : 1, "data" : true }
{ "_id" : 2, "data" : false }
Đây là những gì sẽ xảy ra khi chúng tôi áp dụng $not đến dữ liệu data trường của mỗi tài liệu:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 1, 2 ] } } },
{ $project: {
_id: 0,
data: 1,
result: { $not: [ "$data" ] } }
}
]
) Kết quả:
{ "data" : true, "result" : false }
{ "data" : false, "result" : true }
Chúng ta có thể thấy rằng $not trả về phần ngược lại của mỗi boolean.
Các giá trị bằng 0, rỗng và không xác định
$not toán tử đánh giá 0 , null và undefined dưới dạng false - có nghĩa là nó trả về true .
Giả sử chúng ta có các tài liệu sau:
{ "_id" : 3, "data" : 0 }
{ "_id" : 4, "data" : null }
{ "_id" : 5, "data" : undefined }
Đây là những gì sẽ xảy ra khi chúng tôi áp dụng $not :
db.test.aggregate(
[
{ $match: { _id: { $in: [ 3, 4, 5 ] } } },
{ $project: {
_id: 0,
data: 1,
result: { $not: [ "$data" ] } }
}
]
) Kết quả:
{ "data" : 0, "result" : true }
{ "data" : null, "result" : true }
{ "data" : undefined, "result" : true }
Như mong đợi, tất cả đều trả về true (có nghĩa là họ đã đánh giá là false .
Tất cả các giá trị khác
$not toán tử tất cả các giá trị khác là true - có nghĩa là nó trả về false .
Giả sử chúng ta có các tài liệu sau:
{ "_id" : 6, "data" : [ true ] }
{ "_id" : 7, "data" : [ false ] }
{ "_id" : 8, "data" : 5 }
{ "_id" : 9, "data" : "Bat" }
{ "_id" : 10, "data" : ISODate("2021-01-03T23:30:15.100Z") }
Đây là những gì sẽ xảy ra khi chúng tôi áp dụng $not :
db.test.aggregate(
[
{ $match: { _id: { $in: [ 6, 7, 8, 9, 10 ] } } },
{ $project: {
_id: 0,
data: 1,
result: { $not: [ "$data" ] } }
}
]
) Kết quả:
{ "data" : [ true ], "result" : false }
{ "data" : [ false ], "result" : false }
{ "data" : 5, "result" : false }
{ "data" : "Bat", "result" : false }
{ "data" : ISODate("2021-01-03T23:30:15.100Z"), "result" : false }
Tất cả đều trả về false (có nghĩa là chúng đánh giá thành true ).
Các trường bị thiếu
Đang áp dụng $not đến một trường không tồn tại sẽ đánh giá là false (có nghĩa là nó trả về true ).
Giả sử chúng ta có tài liệu sau:
{ "_id" : 11 }
Và chúng tôi áp dụng $not về điều đó:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 11 ] } } },
{ $project: {
_id: 0,
data: 1,
result: { $not: [ "$data" ] } }
}
]
) Kết quả:
{ "result" : true } Phủ nhận một nhà điều hành khác
$not toán tử có thể được sử dụng để phủ định đầu ra boolean của một toán tử khác.
Giả sử chúng ta có một bộ sưu tập có tên là pets với các tài liệu sau:
{ "_id" : 1, "name" : "Wag", "type" : "Dog", "weight" : 20 }
{ "_id" : 2, "name" : "Bark", "type" : "Dog", "weight" : 10 }
{ "_id" : 3, "name" : "Meow", "type" : "Cat", "weight" : 7 }
{ "_id" : 4, "name" : "Scratch", "type" : "Cat", "weight" : 8 }
{ "_id" : 5, "name" : "Bruce", "type" : "Kangaroo", "weight" : 100 }
{ "_id" : 6, "name" : "Hop", "type" : "Kangaroo", "weight" : 130 }
{ "_id" : 7, "name" : "Punch", "type" : "Kangaroo", "weight" : 200 }
{ "_id" : 8, "name" : "Snap", "type" : "Cat", "weight" : 12 }
{ "_id" : 9, "name" : "Ruff", "type" : "Dog", "weight" : 30 }
Chúng ta có thể sử dụng $not kết hợp với say, $gt để đánh giá trường trọng số:
db.pets.aggregate(
[
{ $project: {
_id: 0,
name: 1,
weight: 1,
result: { $not: [ { $gt: [ "$weight", 100 ] } ] } }
}
]
) Kết quả:
{ "name" : "Wag", "weight" : 20, "result" : true }
{ "name" : "Bark", "weight" : 10, "result" : true }
{ "name" : "Meow", "weight" : 7, "result" : true }
{ "name" : "Scratch", "weight" : 8, "result" : true }
{ "name" : "Bruce", "weight" : 100, "result" : true }
{ "name" : "Hop", "weight" : 130, "result" : false }
{ "name" : "Punch", "weight" : 200, "result" : false }
{ "name" : "Snap", "weight" : 12, "result" : true }
{ "name" : "Ruff", "weight" : 30, "result" : true }
Để nhắc lại điều này, đây là một lần nữa nhưng lần này chúng tôi xuất một trường cho $gt kết quả, cũng như trường cho không $gt kết quả:
db.pets.aggregate(
[
{ $project: {
_id: 0,
weight: 1,
gt: { $gt: [ "$weight", 100 ] },
notGt: { $not: [ { $gt: [ "$weight", 100 ] } ] } }
}
]
) Kết quả:
{ "weight" : 20, "gt" : false, "notGt" : true }
{ "weight" : 10, "gt" : false, "notGt" : true }
{ "weight" : 7, "gt" : false, "notGt" : true }
{ "weight" : 8, "gt" : false, "notGt" : true }
{ "weight" : 100, "gt" : false, "notGt" : true }
{ "weight" : 130, "gt" : true, "notGt" : false }
{ "weight" : 200, "gt" : true, "notGt" : false }
{ "weight" : 12, "gt" : false, "notGt" : true }
{ "weight" : 30, "gt" : false, "notGt" : true }
Mỗi lần $gt kết quả là true , $not toán tử lật nó thành false . Và mỗi lần $gt dẫn đến false , $not lật nó thành true .