Toán tử $exists kiểm tra sự tồn tại của trường trong tài liệu, trong khi $ne (not equal) kiểm tra giá trị khác với giá trị cho trước. Kết hợp chúng để tìm tài liệu có trường tồn tại VÀ giá trị khác rỗng/null.
Tạo dữ liệu mẫu
> db.existsDemo.insertOne({"Name":"Chris","Age":21});
{ "acknowledged" : true, "insertedId" : ObjectId("5cd7c3916d78f205348bc650") }
> db.existsDemo.insertOne({"Name":"","Age":null});
{ "acknowledged" : true, "insertedId" : ObjectId("5cd7c39a6d78f205348bc651") }
> db.existsDemo.insertOne({"Name":null,"Age":24});
{ "acknowledged" : true, "insertedId" : ObjectId("5cd7c3a66d78f205348bc652") }
> db.existsDemo.insertOne({"Age":23});
{ "acknowledged" : true, "insertedId" : ObjectId("5cd7c3c36d78f205348bc653") }
Xem dữ liệu
> db.existsDemo.find().pretty();
Truy vấn: Name tồn tại VÀ khác chuỗi rỗng
Kết quả
Giải thích từng tài liệu
| _id | Name | $exists: true | $ne: "" | Kết quả |
| ...650 | "Chris" | ✅ | ✅ | ✅ Khớp |
| ...651 | "" | ✅ | ❌ | ❌ |
| ...652 | null | ✅ | ✅ (null ≠ "") | ✅ Khớp |
| ...653 | (missing) | ❌ | - | ❌ |
Phân biệt $exists, $ne, $type
| Toán tử | Kiểm tra | Khớp null | Khớp missing | Khớp "" |
{$exists: true} | Trường tồn tại | ✅ | ❌ | ✅ |
{$ne: null} | Khác null | ❌ | ✅ (missing ≠ null) | ✅ |
{$ne: ""} | Khác chuỗi rỗng | ✅ | ✅ | ❌ |
{$type: "null"} | BSON type null | ✅ | ❌ | ❌ |
{$type: "string"} | BSON type string | ❌ | ❌ | ✅ |
Các pattern thường dùng
1. Trường tồn tại, không null, không rỗng
2. Trường tồn tại VÀ có giá trị (not null, not empty string, not empty array)
3. Sử dụng $nin cho nhiều giá trị loại trừ
Lưu ý
$exists: true + $ne: "" thường dùng cho validation dữ liệu
- Null ≠ undefined ≠ missing ≠ empty string trong MongoDB
- Tạo index trên trường thường query:
db.existsDemo.createIndex({Name: 1})