Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MongoDB

Cách xác định trường (field) có tồn tại trong MongoDB

Giới thiệu

Để kiểm tra xem một tài liệu có chứa một trường cụ thể hay không (bất kể giá trị), bạn sử dụng toán tử $exists.

Cú pháp

// Trường tồn tại (kể cả null, "")
db.collection.find({ tenTruong: { $exists: true } });

// Trường KHÔNG tồn tại
db.collection.find({ tenTruong: { $exists: false } });

Ví dụ minh họa

1. Tạo dữ liệu: Một số doc có ClientAge, ClientCountryName, một số không

> db.kiemTraTonTai.insertOne({ "TenKhachHang": "John" });
{ "acknowledged" : true, "insertedId" : ObjectId("5c9eb245d628fa4220163b75") }
> db.kiemTraTonTai.insertOne({ "TenKhachHang": "Larry", "TuoiKhachHang": 23 });
{ "acknowledged" : true, "insertedId" : ObjectId("5c9eb25cd628fa4220163b76") }
> db.kiemTraTonTai.insertOne({ "TenKhachHang": "Mike", "QuocGia": "UK" });
{ "acknowledged" : true, "insertedId" : ObjectId("5c9eb26fd628fa4220163b77") }
> db.kiemTraTonTai.insertOne({ "TenKhachHang": "Sam", "TuoiKhachHang": 24 });
{ "acknowledged" : true, "insertedId" : ObjectId("5c9eb286d628fa4220163b78") }

2. Tìm doc CÓ trường TuoiKhachHang

> db.kiemTraTonTai.find({ TuoiKhachHang: { $exists: true } }).pretty();

3. Kết quả - 2 doc (Larry và Sam)

{ "_id" : ObjectId("5c9eb25cd628fa4220163b76"), "TenKhachHang" : "Larry", "TuoiKhachHang" : 23 }
{ "_id" : ObjectId("5c9eb286d628fa4220163b78"), "TenKhachHang" : "Sam", "TuoiKhachHang" : 24 }

4. Tìm doc CÓ trường QuocGia

> db.kiemTraTonTai.find({ QuocGia: { $exists: true } }).pretty();
{ "_id" : ObjectId("5c9eb26fd628fa4220163b77"), "TenKhachHang" : "Mike", "QuocGia" : "UK" }

Phân biệt: $exists vs $ne null

Đây là điểm quan trọng dễ nhầm lẫn:

Document{ f: { $exists: true } }{ f: { $ne: null } }
{ f: "value" }✅ Match✅ Match
{ f: null }✅ Match (field tồn tại)❌ Không match
{ f: "" }✅ Match✅ Match
{ } (không có f)❌ Không match✅ Match! (missing ≠ null)

Kết luận: Dùng $exists: true khi muốn kiểm tra sự tồn tại của field. Dùng $ne: null khi muốn loại trừ giá trị null (nhưng sẽ include doc missing field).

Kết hợp: Tồn tại VÀ có giá trị hợp lệ

// Tồn tại, không null, không rỗng
db.collection.find({ 
    tenTruong: { $exists: true, $nin: [null, ""] } 
});

Trong Aggregation

db.collection.aggregate([
    { $match: { tenTruong: { $exists: true } } },
    { $project: { 
        coTruong: { $cond: [ { $gt: [ { $strLenCP: { $ifNull: ["$tenTruong", ""] } }, 0 ] }, true, false ] }
    } }
]);

Schema Validation (MongoDB 3.6+)

Để bắt buộc field phải tồn tại tại cấp schema:

db.createCollection("users", {
    validator: {
        $jsonSchema: {
            required: ["email", "name"],
            properties: {
                email: { bsonType: "string" },
                name: { bsonType: "string" }
            }
        }
    }
});