Để kiểm tra xem một trường/phần tử có tồn tại trong document hay không, sử dụng toán tử $exists.
Tạo collection với dữ liệu không đồng nhất
> db.demo497.insertOne({"details":[{"Name":"Chris"},{"Name":"Bob"}]});
> db.demo497.insertOne({"details":[{"Name":"Carol"}]});
> db.demo497.insertOne({"details":[{}]})
Hiển thị dữ liệu
> db.demo497.find();
Kết quả (3 document):
1. details: [{Name:"Chris"}, {Name:"Bob"}]
2. details: [{Name:"Carol"}]
3. details: [{}] // object rỗng, không có Name
Truy vấn: Name khác "Carol" HOẶC details không tồn tại
> db.demo497.find({
$or: [
{ "details.Name": { $ne: "Carol" } },
{ details: { $exists: false } }
]
});
Kết quả (document 1 và 3):
1. details: [{Name:"Chris"}, {Name:"Bob"}] // Name ≠ Carol
3. details: [{}] // Name không tồn tại trong object rỗng → $ne khớp
Giải thích:
{$ne: "Carol"}: Khớp khi Name tồn tại VÀ khác "Carol", HOẶC Name **không tồn tại** (quan trọng!){$exists: false}: Khớp khi trường details hoàn toàn không có trong document- Document 3:
detailstồn tại (mảng có 1 object rỗng) →$exists: falsesai, nhưngdetails.Namekhông tồn tại →$neđúng → khớp
Lưu ý quan trọng về $exists vs $ne:
| Điều kiện | Field tồn tại, giá trị khác | Field tồn tại, giá trị null | Field không tồn tại |
|---|---|---|---|
| {field: {$ne: "val"}} | ✓ Khớp | ✓ Khớp | ✓ Khớp |
| {field: {$exists: true}} | ✓ Khớp | ✓ Khớp | ✗ Không khớp |
| {field: {$exists: false}} | ✗ Không khớp | ✗ Không khớp | ✓ Khớp |