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

Truy vấn record trường null hoặc không tồn tại trong MongoDB

Trong MongoDB, có 2 trường hợp khác nhau khi tìm kiếm trường "rỗng": trường tồn tại nhưng giá trị null, và trường hoàn toàn không tồn tại.

Trường hợp 1: Trường tồn tại và giá trị = null

db.yourCollectionName.count({yourFieldName: null});

Trường hợp 2: Trường không tồn tại (missing field)

db.yourCollectionName.count({yourFieldName: {$exists: false}});

Ví dụ minh họa

Tạo collection và dữ liệu

> db.fieldIsNullOrNotSetDemo.insertOne({"EmployeeName":"Larry","EmployeeAge":null,"EmployeeSalary":18500});
{ "acknowledged" : true, "insertedId" : ObjectId("5c8a995c6cea1f28b7aa07fe") }
> db.fieldIsNullOrNotSetDemo.insertOne({"EmployeeName":"Bob","EmployeeAge":21,"EmployeeSalary":23500});
{ "acknowledged" : true, "insertedId" : ObjectId("5c8a99836cea1f28b7aa07ff") }
> db.fieldIsNullOrNotSetDemo.insertOne({"EmployeeName":"Carol","EmployeeSalary":45500});
{ "acknowledged" : true, "insertedId" : ObjectId("5c8a999b6cea1f28b7aa0800") }
> db.fieldIsNullOrNotSetDemo.insertOne({"EmployeeName":"Mike","EmployeeAge":null,"EmployeeSalary":45500});
{ "acknowledged" : true, "insertedId" : ObjectId("5c8a99bb6cea1f28b7aa0801") }
> db.fieldIsNullOrNotSetDemo.insertOne({"EmployeeName":"Ramit","EmployeeSalary":85500});
{ "acknowledged" : true, "insertedId" : ObjectId("5c8a99d76cea1f28b7aa0802") }

Xem tất cả documents

> db.fieldIsNullOrNotSetDemo.find().pretty();
{
    "_id" : ObjectId("5c8a995c6cea1f28b7aa07fe"),
    "EmployeeName" : "Larry",
    "EmployeeAge" : null,
    "EmployeeSalary" : 18500
}
{
    "_id" : ObjectId("5c8a99836cea1f28b7aa07ff"),
    "EmployeeName" : "Bob",
    "EmployeeAge" : 21,
    "EmployeeSalary" : 23500
}
{
    "_id" : ObjectId("5c8a999b6cea1f28b7aa0800"),
    "EmployeeName" : "Carol",
    "EmployeeSalary" : 45500
}
{
    "_id" : ObjectId("5c8a99bb6cea1f28b7aa0801"),
    "EmployeeName" : "Mike",
    "EmployeeAge" : null,
    "EmployeeSalary" : 45500
}
{
    "_id" : ObjectId("5c8a99d76cea1f28b7aa0802"),
    "EmployeeName" : "Ramit",
    "EmployeeSalary" : 85500
}

Trường hợp 1: EmployeeAge tồn tại và = null

> db.fieldIsNullOrNotSetDemo.count({EmployeeAge: null});
4

Kết quả 4: Larry (null), Bob (21), Mike (null), Ramit (missing - MongoDB coi missing = null khi query bằng null).

Lưu ý quan trọng: Trong MongoDB, query {field: null} khớp cả 2 trường hợp: trường có giá trị null VÀ trường không tồn tại. Đây là hành vi mặc định.

Trường hợp 2: EmployeeAge không tồn tại (chỉ missing, không tính null)

> db.fieldIsNullOrNotSetDemo.count({EmployeeAge: {$exists: false}});
2

Kết quả 2: Carol và Ramit (2 document không có trường EmployeeAge).

Tóm tắt sự khác biệt

QueryKhớp vớiVí dụ kết quả
{age: null}age = null HOẶC age missing4 document
{age: {$exists: false}}Chỉ age missing2 document
{age: {$exists: true, $eq: null}}Chỉ age = null (có trường)2 document (Larry, Mike)

Best Practice

Để phân biệt rõ ràng, hãy dùng:

  • Tìm null có trường: { field: { $exists: true, $eq: null } }
  • Tìm missing: { field: { $exists: false } }
  • Tìm cả hai: { field: null } (mặc định)