Trong MongoDB, bạn có thể sử dụng $exists
toán tử truy vấn phần tử để so khớp các tài liệu có chứa một trường cụ thể.
Bạn cũng có thể sử dụng nó để đối sánh các tài liệu không chứa một trường cụ thể.
Bạn cũng có thể sử dụng nó kết hợp với các toán tử khác như $nin
để khớp với các tài liệu trong đó trường nhất định tồn tại, nhưng trường đó không chứa giá trị cụ thể.
Ví dụ
Giả sử chúng ta có một bộ sưu tập có tên là cats
chứa các tài liệu sau:
{ "_id" : 1, "name" : "Scratch", "born" : "March, 2020" } { "_id" : 2, "name" : "Meow", "weight" : 30 } { "_id" : 3, "name" : "Fluffy", "height" : 15 } { "_id" : 4, "name" : "Sox", "weight" : 40 } { "_id" : 5, "name" : null, "weight" : 20 } { "_id" : 6, "height" : 20, "born" : ISODate("2021-01-03T23:30:15.123Z") }
Các tài liệu này hơi mâu thuẫn với các trường mà chúng có. Một số có weight
, những trường khác có height
, một số có born
trường, v.v.
Chúng tôi có thể sử dụng $exists
toán tử để trả về các tài liệu từ bộ sưu tập đó có một trường cụ thể.
Ví dụ:
db.cats.find( { weight: { $exists: true } } )
Kết quả:
{ "_id" : 2, "name" : "Meow", "weight" : 30 } { "_id" : 4, "name" : "Sox", "weight" : 40 } { "_id" : 5, "name" : null, "weight" : 20 }
Chúng tôi có thể thấy rằng chỉ những tài liệu có chứa weight
trường được trả về.
Các trường chứa null
$exists
toán tử bao gồm các trường chứa null
. Nó không phân biệt giữa null
và không phải null
giá trị.
Ví dụ:
db.cats.find( { name: { $exists: true } } )
Kết quả:
{ "_id" : 1, "name" : "Scratch", "born" : "March, 2020" } { "_id" : 2, "name" : "Meow", "weight" : 30 } { "_id" : 3, "name" : "Fluffy", "height" : 15 } { "_id" : 4, "name" : "Sox", "weight" : 40 } { "_id" : 5, "name" : null, "weight" : 20 }
Chúng tôi có thể thấy rằng tài liệu 5 đã được trả lại, mặc dù name
của nó trường null
.
Tồn tại mà không có giá trị cụ thể
Bạn có thể kết hợp $exists
với các toán tử khác để trả về các tài liệu có chứa trường, nhưng trường đó không chứa một giá trị cụ thể.
Ví dụ:
db.cats.find( { weight: { $exists: true, $nin: [20,30] } } )
Kết quả:
{ "_id" : 4, "name" : "Sox", "weight" : 40 }
Đây là một kết quả khác với kết quả mà chúng tôi sẽ thấy nếu chúng tôi chỉ sử dụng $nin
không có $exists
nhà điều hành.
Đây là những gì sẽ trông như thế nào:
db.cats.find( { weight: { $nin: [20,30] } } )
Kết quả:
{ "_id" : 1, "name" : "Scratch", "born" : "March, 2020" } { "_id" : 3, "name" : "Fluffy", "height" : 15 } { "_id" : 4, "name" : "Sox", "weight" : 40 } { "_id" : 6, "height" : 20, "born" : ISODate("2021-01-03T23:30:15.123Z") }
Tài liệu không chứa trường cụ thể
Bạn có thể sử dụng $exists: false
để trả lại các tài liệu không chứa trường được chỉ định.
Ví dụ:
db.cats.find( { name: { $exists: false } } )
Kết quả:
{ "_id" : 6, "height" : 20, "born" : ISODate("2021-01-03T23:30:15.123Z") }
Trong trường hợp này, một tài liệu trong bộ sưu tập không chứa name
trường.
Kiểm tra nhiều trường
Bạn có thể kiểm tra sự tồn tại của nhiều trường bằng cách phân tách chúng bằng dấu phẩy.
Ví dụ:
db.cats.find( {
name: { $exists: true },
height: { $exists: true }
} )
Kết quả:
{ "_id" : 3, "name" : "Fluffy", "height" : 15 }
Ví dụ này trả về tất cả các tài liệu chứa cả name
trường và height
trường.