Hướng dẫn $exists trong mongodb - $ tồn tại trong mongodb

This entry is part 17 of 24 in the series MongoDB

  • MongoDB là gì? Các khái niệm trong MongoDB
  • Hướng dẫn cài đặt, cấu hình MongoDB trên Windows 10
  • Cài đặt và sử dụng Robo 3T (RoboMongo) trên Windows
  • Hướng dẫn cài đặt MongoDB trên Linux (Ubuntu 16.04)
  • Hướng dẫn MongoDB – Tạo database trong MongoDB
  • Hướng dẫn MongoDB – Xóa, DROP database trong MongoDB
  • Tạo bảng, collections trong MongoDB (Tạo bằng dòng lệnh, Robo3t)
  • Xóa bảng, collections trong MongoDB (Xóa bằng lệnh/ Robo3T)
  • Insert document, bản ghi trong MongoDB (Insert bằng lệnh, Robo3T)
  • Truy vấn dữ liệu/document, find(), Select, Where trong MongoDB
  • Xóa document, row trong MongoDB (bằng dòng lệnh, Robo3T)
  • Update document, dữ liệu trong MongoDB
  • Projection trong MongoDB (SELECT field/column trong MongoDB)
  • Sắp xếp trong MongoDB(orderBy, sorting() trong MongoDB)
  • Ưu nhược điểm của MongoDB, khi nào nên dùng MongoDB
  • Xóa cột, field, trường của collections trong MongoDB ($unset)
  • Kiểm tra null, check tồn tại trong MongoDB với $exists
  • Đổi tên field trong MongoDB với $rename
  • Tạo user/roles, phân quyền người dùng trên MongoDB
  • Các loại roles, vai trò, quyền trong MongoDB.
  • Đăng nhập mongodb với username và password (database mongo)
  • Tạo Replica Set trong MongoDB, Ví dụ Replica Set MongoDB
  • Replication, Replica Set trong MongoDB là gì?
  • Phân trang trong MongoDB (skip(), limit() paging trong 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'}])

Hướng dẫn $exists trong mongodb - $ tồn tại trong mongodb

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}})

Hướng dẫn $exists trong mongodb - $ tồn tại trong mongodb

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:

Hướng dẫn $exists trong mongodb - $ tồn tại trong mongodb

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ả:

Hướng dẫn $exists trong mongodb - $ tồn tại trong mongodb

Chỉ duy nhất bản ghi có _id = 3 là không thỏa mãn.

Okay, Done!

References:

https://docs.mongodb.com/manual/reference/operator/query/exists/

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.MongoDB Manual

Không cần một chỉ số thưa thớt trên

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ổ:

db.getCollection('player').find({country: {$ne: null}})
7 Truy vấn

Sử dụng chỉ mục thưa thớt

Sử dụng chỉ mục không phân bổ

{ 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

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

{ 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 }
4.

Hiệu quả hơn các truy vấn không có chỉ mục, nhưng vẫn yêu cầu

{ 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 }
4.

{ 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 }
6

Không thể sử dụng chỉ mục và yêu cầu

{ 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 }
7.

Yêu cầu

{ 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 }
4.

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:

  1. Tạo bộ sưu tập

    db.records.find( { a: { $exists: true } } )

    2:

    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ó

    db.records.find( { a: { $exists: true } } )

    3 của:

    • db.records.find( { a: { $exists: true } } )

      4 có giá trị null

      db.records.find( { a: { $exists: true } } )

      5.

    • db.inventory.find( { qty: { $exists: true, $nin: [ 5, 15 ] } } )

      1 bị thiếu giá trị

      db.records.find( { a: { $exists: true } } )

      5.

  2. Tạo một chỉ mục thưa thớt trên trường

    db.records.find( { a: { $exists: true } } )

    5:

    db.getCollection('player').find({country: {$ne: null}})
    0

  3. Ví dụ sau đếm các tài liệu trong đó trường

    db.records.find( { a: { $exists: true } } )

    5 có giá trị (bao gồm NULL) và sử dụng chỉ mục thưa thớt:

    db.getCollection('player').find({country: {$ne: null}})
    1

    Ví dụ trả về 5. Tài liệu thiếu giá trị

    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:

  • 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.

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: