This entry is part 17 of 24 in the series MongoDB
Kiểm tra null, check tồn tại trong MongoDB với $exists.
Trong MongoDB, dữ liệu lưu ở collection không có cấu trúc dữ liệu cố định. Tức là bản ghi [document] này có field này nhưng bản ghi khác lại không có field đó.
Do đó khi truy vấn, tìm kiếm theo field nào đó, ta cần phân biệt field đó null hay là không tồn tại.
Ví dụ mình insert 5 bản ghi [document] sau vào collection
db.getCollection['player'].find[{country: {$ne: null}}]3
db.player.insert[[ {'_id':'1', 'name':'neymar', 'country':null, 'age':'25'}, {'_id':'2', 'name':'hazard', 'country':null, 'age':'25'}, {'_id':'3', 'name':'mbappe', 'age':'18'}, {'_id':'4', 'name':'modric', 'country':'croatia', 'age':'30'}, {'_id':'5', 'name':'ronaldo', 'country':'portugal', 'age':'33'}]]
Trong đó bản ghi 1 và 2 có field
db.getCollection['player'].find[{country: {$ne: null}}]4 là null, bản ghi thứ 3 không tồn tại field
db.getCollection['player'].find[{country: {$ne: null}}]4
Bây giờ mình sẽ thực hiện lấy ra các bản ghi [document] có
db.getCollection['player'].find[{country: {$ne: null}}]4 khác null:
db.getCollection['player'].find[{country: {$ne: null}}]
Rõ ràng field không tồn tại cũng được tính như là field có giá trị bằng null.
Tương tự ta lấy các bản ghi có country bằng null thì kết quả như sau:
Kiểm tra field tồn tại trong MongoDB [$exists]
Field/trường không tồn tại tương đương với giá trị bằng null, tuy nhiên nếu muốn kiểm tra chính xác field đó có tồn tại hay không thì ta phải dùng tới
db.getCollection['player'].find[{country: {$ne: null}}]7
Ví dụ, tìm các document có chứa trường
db.getCollection['player'].find[{country: {$ne: null}}]4
db.getCollection['player'].find[{country: {$exists: true}}]
Kết quả:
Chỉ duy nhất bản ghi có _id = 3 là không thỏa mãn.
Okay, Done!
References:
//docs.mongodb.com/manual/reference/operator/query/exists/
Có thể sử dụng
2 thay vì { a: 5, b: 5, c: null } { a: 3, b: null, c: 8 } { a: null, b: 3, c: 9 } { a: 1, b: 2, c: 3 } { a: 2, c: 5 } { a: 3, b: 2 } { a: 4 }
3. → MongoDB Manual{ a: 5, b: 5, c: null } { a: 3, b: null, c: 8 } { a: null, b: 3, c: 9 } { a: 1, b: 2, c: 3 } { a: 2, c: 5 } { a: 3, b: 2 } { a: 4 }
db.records.find[ { a: { $exists: true } } ]
1.Syntax:
db.getCollection['player'].find[{country: {$exists: true}}]0
Ví dụ: sử dụng bộ sưu tập
db.records.find[ { a: { $exists: true } } ]
2:db.getCollection['player'].find[{country: {$ne: null}}]7 matches the documents that contain the field, including documents where the field value is
db.getCollection['player'].find[{country: {$exists: true}}]3. If
db.getCollection['player'].find[{country: {$exists: true}}]1 is false, the query returns only the documents that do not contain the field. [1]
Ví dụ trả về 4. Các tài liệu thiếu giá trị
db.records.find[ { a: { $exists: true } } ]
5 hoặc có giá trị null db.records.find[ { a: { $exists: true } } ]
5 không được tính.not correspond to SQL operator db.getCollection['player'].find[{country: {$exists: true}}]6. For SQL
db.getCollection['player'].find[{country: {$exists: true}}]6, refer to the
db.getCollection['player'].find[{country: {$exists: true}}]8 operator.
Mẹo
Nếu bạn chỉ cần tài liệu trong đó
db.records.find[ { a: { $exists: true } } ]
1 có giá trị không null, bạn:db.inventory.find[ { qty: { $exists: true, $nin: [ 5, 15 ] } } ]
Có thể sử dụng
{ a: 5, b: 5, c: null } { a: 3, b: null, c: 8 } { a: null, b: 3, c: 9 } { a: 1, b: 2, c: 3 } { a: 2, c: 5 } { a: 3, b: 2 } { a: 4 }
2 thay vì { a: 5, b: 5, c: null } { a: 3, b: null, c: 8 } { a: null, b: 3, c: 9 } { a: 1, b: 2, c: 3 } { a: 2, c: 5 } { a: 3, b: 2 } { a: 4 }
3.Không cần một chỉ số thưa thớt trên
db.records.find[ { a: { $exists: true } } ]
1.{ a: 5, b: 5, c: null } { a: 3, b: null, c: 8 } { a: null, b: 3, c: 9 } { a: 1, b: 2, c: 3 } { a: 2, c: 5 } { a: 3, b: 2 } { a: 4 } { b: 2, c: 4 } { b: 2 } { c: 6 }
Ví dụ: sử dụng bộ sưu tập
db.records.find[ { a: { $exists: true } } ]
2:db.records.find[ { a: { $exists: true } } ]
Ví dụ trả về 4. Các tài liệu thiếu giá trị
db.records.find[ { a: { $exists: true } } ]
5 hoặc có giá trị null db.records.find[ { a: { $exists: true } } ]
5 không được tính.{ a: 5, b: 5, c: null } { a: 3, b: null, c: 8 } { a: null, b: 3, c: 9 } { a: 1, b: 2, c: 3 } { a: 2, c: 5 } { a: 3, b: 2 } { a: 4 }
Xem thêm:
db.records.find[ { b: { $exists: false } } ]
Tài liệu về nhà → Hướng dẫn sử dụng MongoDB
{ a: 2, c: 5 } { a: 4 } { c: 6 }
db.getCollection['player'].find[{country: {$ne: null}}]7sYNTAX:
db.getCollection['player'].find[{country: {$exists: true}}]0
Bảng sau so sánh hiệu suất truy vấn
db.getCollection['player'].find[{country: {$ne: null}}]7 bằng cách sử dụng các chỉ mục thưa thớt và không phân bổ:
| Hiệu quả nhất. MongoDB có thể tạo ra một trận đấu chính xác và không yêu cầu | Hiệu quả hơn các truy vấn không có chỉ mục, nhưng vẫn yêu cầu | ||||||||||||||||||||||||||||||
| Không thể sử dụng chỉ mục và yêu cầu | Yêu cầu |
Các truy vấn sử dụng
{ a: 5, b: 5, c: null } { a: 3, b: null, c: 8 } { a: null, b: 3, c: 9 } { a: 1, b: 2, c: 3 } { a: 2, c: 5 } { a: 3, b: 2 } { a: 4 } { b: 2, c: 4 } { b: 2 } { c: 6 }
3 trên các trường sử dụng chỉ mục không phân bổ hoặc sử dụng { a: 5, b: 5, c: null } { a: 3, b: null, c: 8 } { a: null, b: 3, c: 9 } { a: 1, b: 2, c: 3 } { a: 2, c: 5 } { a: 3, b: 2 } { a: 4 } { b: 2, c: 4 } { b: 2 } { c: 6 }
3 trên các trường không được lập chỉ mục kiểm tra tất cả các tài liệu trong một bộ sưu tập. Để cải thiện hiệu suất, hãy tạo một chỉ mục thưa thớt trên db.records.find[ { a: { $exists: true } } ]
1 như được hiển thị trong kịch bản sau:Tạo bộ sưu tập
2:db.records.find[ { a: { $exists: true } } ]
db.stockSales.insertMany[ [ { _id: 0, symbol: "ABC", auditDate: new Date[ "2021-05-18T16:12:23Z" ] }, { _id: 1, symbol: "ABC", auditDate: new Date[ "2021-04-21T11:34:45Z" ] }, { _id: 2, symbol: "DEF", auditDate: new Date[ "2021-02-24T15:11:32Z" ] }, { _id: 3, symbol: "DEF", auditDate: null }, { _id: 4, symbol: "DEF", auditDate: new Date[ "2021-07-13T18:32:54Z" ] }, { _id: 5, symbol: "XYZ" } ] ] Tài liệu có
3 của:db.records.find[ { a: { $exists: true } } ]
4 có giá trị nulldb.records.find[ { a: { $exists: true } } ]
5.db.records.find[ { a: { $exists: true } } ]
1 bị thiếu giá trịdb.inventory.find[ { qty: { $exists: true, $nin: [ 5, 15 ] } } ]
5.db.records.find[ { a: { $exists: true } } ]
Tạo một chỉ mục thưa thớt trên trường
5:db.records.find[ { a: { $exists: true } } ]
db.getCollection['player'].find[{country: {$ne: null}}]
0Ví dụ sau đếm các tài liệu trong đó trường
5 có giá trị [bao gồm NULL] và sử dụng chỉ mục thưa thớt:db.records.find[ { a: { $exists: true } } ]
db.getCollection['player'].find[{country: {$ne: null}}]
1Ví dụ trả về 5. Tài liệu thiếu giá trị
5 không được tính.db.records.find[ { a: { $exists: true } } ]
Mẹo
Nếu bạn chỉ cần tài liệu trong đó
db.records.find[ { a: { $exists: true } } ]
1 có giá trị không null, bạn:Có thể sử dụng
2 thay vì{ a: 5, b: 5, c: null } { a: 3, b: null, c: 8 } { a: null, b: 3, c: 9 } { a: 1, b: 2, c: 3 } { a: 2, c: 5 } { a: 3, b: 2 } { a: 4 }
3.{ a: 5, b: 5, c: null } { a: 3, b: null, c: 8 } { a: null, b: 3, c: 9 } { a: 1, b: 2, c: 3 } { a: 2, c: 5 } { a: 3, b: 2 } { a: 4 } Không cần một chỉ số thưa thớt trên
1.db.records.find[ { a: { $exists: true } } ]
Ví dụ: sử dụng bộ sưu tập
db.records.find[ { a: { $exists: true } } ]
2:db.getCollection['player'].find[{country: {$ne: null}}]2
Ví dụ trả về 4. Các tài liệu thiếu giá trị
db.records.find[ { a: { $exists: true } } ]
5 hoặc có giá trị null db.records.find[ { a: { $exists: true } } ]
5 không được tính.Mẹo
Nếu bạn chỉ cần tài liệu trong đó db.records.find[ { a: { $exists: true } } ]
1 có giá trị không null, bạn:
db.records.find[ { a: { $exists: true } } ]