Các toán tử trong MongoDB
- 03-03-2026
- Toanngo92
- 0 Comments
Trong bài viết này này, chúng ta sẽ:
- Mô tả các loại toán tử trong MongoDB
- Giải thích cách sử dụng toán tử truy vấn (query operators) và toán tử chiếu (projection operators)
- Giải thích cách chỉnh sửa dữ liệu của field và mảng bằng các toán tử cập nhật (update operators)
MongoDB cung cấp nhiều loại toán tử khác nhau cho phép người dùng tương tác hiệu quả với cơ sở dữ liệu.
Buổi học này mô tả các loại toán tử trong MongoDB và cách sử dụng chúng nói chung.
Ngoài ra, buổi học còn trình bày chi tiết chức năng của các toán tử phổ biến nhất kèm theo các ví dụ thực tế.
Mục lục
Giới thiệu về các toán tử trong MongoDB
Toán tử (operator) là các từ khóa hoặc ký hiệu được sử dụng để hướng dẫn trình biên dịch hoặc trình thông dịch thực hiện các phép toán toán học hoặc logic cụ thể trên tập dữ liệu theo yêu cầu.
Một số loại toán tử trong MongoDB bao gồm:
- Toán tử truy vấn (Query operators)
- Toán tử chiếu (Projection operators)
- Toán tử cập nhật (Update operators)
- Toán tử khác (Miscellaneous operators)
Toán tử truy vấn
Toán tử truy vấn được sử dụng để truy xuất dữ liệu từ cơ sở dữ liệu.
Các loại toán tử truy vấn bao gồm:
- Comparison operators (Toán tử so sánh)
- Logical operators (Toán tử logic)
- Element operators (Toán tử phần tử)
- Array operators (Toán tử mảng)
Toán tử so sánh
Toán tử so sánh dùng để so sánh giá trị của một field với một giá trị được chỉ định và trả về các document có giá trị khớp với điều kiện đó.
Bảng 3.1 mô tả các toán tử so sánh trong MongoDB.
| Operator | Description |
|---|---|
$eq | Dùng để truy xuất, cập nhật hoặc xóa các document mà giá trị của field bằng với giá trị được chỉ định |
$gt | Dùng để truy xuất, cập nhật hoặc xóa các document mà giá trị của field lớn hơn giá trị được chỉ định |
$gte | Dùng để truy xuất, cập nhật hoặc xóa các document mà giá trị của field lớn hơn hoặc bằng giá trị được chỉ định |
$in | Dùng để truy xuất, cập nhật hoặc xóa các document mà giá trị của field nằm trong một mảng giá trị được chỉ định |
$lt | Dùng để truy xuất, cập nhật hoặc xóa các document mà giá trị của field nhỏ hơn giá trị được chỉ định |
$lte | Dùng để truy xuất, cập nhật hoặc xóa các document mà giá trị của field nhỏ hơn hoặc bằng giá trị được chỉ định |
$ne | Dùng để truy xuất, cập nhật hoặc xóa các document mà giá trị của field khác với giá trị được chỉ định |
$nin | Dùng để truy xuất, cập nhật hoặc xóa các document mà giá trị của field không nằm trong bất kỳ giá trị nào của mảng được chỉ định |
$eq Operator
Toán tử này kiểm tra xem giá trị của một field có bằng với giá trị được chỉ định hay không.
Cú pháp:
{ <field>: { $eq: <value> } }
Ví dụ:
Hình 3.1 hiển thị các document được lưu trong collection accounts thuộc database mẫu có tên sample_analytics.

Nếu người dùng muốn xem các tài khoản (accounts) có giá trị limit bằng 9000, người dùng có thể thực thi truy vấn sử dụng toán tử $eq như sau:
db.accounts.find({limit:{$eq:9000}})
Hình 3.2 hiển thị kết quả của truy vấn này.

$lt Operator
Toán tử này kiểm tra xem giá trị của một field có nhỏ hơn giá trị được chỉ định hay không.
Cú pháp:
{ <field>: { $lt: <value> } }
Ví dụ:
Trong collection accounts, nếu người dùng muốn xem các document có giá trị limit nhỏ hơn 5000, truy vấn sẽ là:
db.accounts.find({limit:{$lt:5000}})
Hình 3.3 hiển thị kết quả của truy vấn này.

$in Operator
Toán tử này kiểm tra xem giá trị của một field có khớp với bất kỳ giá trị nào trong mảng được chỉ định hay không.
Cú pháp:
{ field: { $in: [<value1>, <value2>, ..., <valueN>] } }
Ví dụ:
Nếu người dùng muốn xem các document trong collection accounts mà sản phẩm (product) là ‘Commodity’ hoặc ‘InvestmentStock’, truy vấn sẽ là:
db.accounts.find({products:{$in:['Commodity','InvestmentStock']}})
Hình 3.4 hiển thị kết quả của truy vấn này.

Toán tử logic
Toán tử logic đánh giá nhiều biểu thức và trả về một giá trị Boolean (true hoặc false).
Bốn toán tử logic bao gồm:
$and$or$nor$not
$and Operator
Toán tử này thực hiện phép toán logic AND.
Nó chỉ liệt kê các document thỏa mãn tất cả các biểu thức được chỉ định.
Cú pháp:
{ $and: [ { <expression1> }, { <expression2> }, ... , { <expressionN> } ] }
Ví dụ:
Nếu người dùng muốn xem các document trong collection accounts mà:
- limit ≥ 5000
- và limit < 7000
Truy vấn sẽ là:
db.accounts.find({$and:[{limit:{$gte:5000}}, {limit:{$lt:7000}}]})
Hình 3.5 hiển thị kết quả của truy vấn này.

$or Operator
Toán tử $or thực hiện phép toán logic OR.
Nó liệt kê các document thỏa mãn ít nhất một trong các biểu thức được chỉ định.
Cú pháp:
{ $or: [ { <expression1> }, { <expression2> }, ... , { <expressionN> } ] }
Ví dụ:
Nếu người dùng muốn xem tất cả các document mà:
- limit ≤ 5000
- hoặc limit = 7000
Truy vấn sẽ là:
db.accounts.find({$or:[{limit:{$lte:5000}}, {limit:{$eq:7000}}]})
Hình 3.6 hiển thị kết quả của truy vấn này.

$nor Operator
Toán tử này thực hiện phép toán logic NOR.
Nó liệt kê các document không thỏa mãn bất kỳ biểu thức nào trong mảng biểu thức được chỉ định.
Cú pháp:
{ $nor: [ { <expression1> }, { <expression2> }, ... , { <expressionN> } ] }
Ví dụ:
Nếu người dùng muốn xem các document mà limit không bằng 9000 và không bằng 10000, truy vấn sẽ là:
db.accounts.find({$nor:[{limit:9000},{limit:10000}]})
Hình 3.7 hiển thị kết quả của truy vấn này.

Dưới đây là bản dịch chi tiết, đầy đủ, không rút gọn và không bỏ sót nội dung phần tiếp theo từ các trang anh vừa gửi (tiếp tục Session 3 – MongoDB Operators).
$not Operator
Toán tử này thực hiện phép toán logic NOT.
Nó liệt kê các document không khớp với biểu thức được chỉ định.
Cú pháp:
{ field: { $not: { <operator-expression> } } }
Ví dụ:
Giả sử trong collection accounts, người dùng muốn xem tất cả các document mà giá trị limit không lớn hơn hoặc bằng 5000.
Người dùng có thể thực thi truy vấn sử dụng toán tử $not như sau:
db.accounts.find({ limit: { $not: { $gte: 5000 } } })
Hình 3.8 hiển thị kết quả của truy vấn này.

Toán tử phần tử
Toán tử phần tử được sử dụng để kiểm tra:
- Một field cụ thể có tồn tại trong document hay không
- Hoặc một field có kiểu dữ liệu xác định hay không
Các toán tử này được sử dụng với hai giá trị: true hoặc false.
- Nếu dùng với giá trị true, truy vấn sẽ trả về tất cả document có chứa field được chỉ định hoặc field có kiểu dữ liệu được chỉ định.
- Nếu dùng với giá trị false, truy vấn sẽ trả về các document không chứa field đó hoặc không có field với kiểu dữ liệu được chỉ định.
MongoDB hỗ trợ hai toán tử phần tử:
$exists$type
$exists Operator
Toán tử $exists kiểm tra xem field được chỉ định có tồn tại trong document hay không.
- Nếu dùng với true,
$existstrả về các document có chứa field được chỉ định (kể cả khi giá trị của field là null). - Nếu dùng với false,
$existstrả về các document không chứa field đó.
Cú pháp:
{ field: { $exists: <boolean> } }
Trong đó <boolean> có hai giá trị: true hoặc false.
Ví dụ minh họa
Trước khi hiểu cách hoạt động của toán tử này, hãy tạo:
- Database:
Product_detail - Collection:
product_delivery
Sau đó chèn 5 document vào collection product_delivery:
db.product_delivery.insertMany([
{ _id:1, address:"2130 Messy Way", zipCode:"90698345",
delivered:["Documents","Food","electronics","Books"],
Feedback:[{product:"xyz",score:6},{product:"abc",score:7}] },
{ _id:2, address:"156 Lunar way garden",
delivered:["Food","electronics"],
Feedback:[{product:"xyz",score:5},{product:"abc",score:4}] },
{ _id:3, address:"456 Penny way Palace", zipCode:3921412,
delivered:["electronics"],
Feedback:[{product:"xyz",score:8},{product:"abc",score:9}] },
{ _id:4, address:"155 Solar Ring road",
delivered:["Books"],
Feedback:[{product:"xyz",score:5},{product:"abc",score:2}] },
{ _id:5, address:"134 Julie Garden",
zipCode:["834847278","1893289032"],
delivered:["Food","electronics"],
Feedback:[{product:"xyz",score:4},{product:"abc",score:8}] }
])
Hình 3.9 mô phỏng kết quả

Truy vấn sử dụng $exists
Giả sử người dùng muốn xem các document không có zipCode.
db.product_delivery.find({ "zipCode": { $exists:false } })

$type Operator
Toán tử này trả về các document mà kiểu dữ liệu của field được chỉ định khớp với kiểu dữ liệu được yêu cầu.
Toán tử $type rất hữu ích khi xử lý dữ liệu không có cấu trúc rõ ràng hoặc collection phức tạp.
Cú pháp:
{ field: { $type: <BSON type> } }
Toán tử $type chấp nhận:
- Tên alias
- Hoặc số đại diện cho kiểu dữ liệu
Bảng 3.2: Kiểu dữ liệu và số tương ứng
| Datatype | Number | Alias |
|---|---|---|
| Double | 1 | “double” |
| String | 2 | “string” |
| Object | 3 | “object” |
| Array | 4 | “array” |
| Binary data | 5 | “binData” |
| ObjectId | 7 | “objectId” |
| Boolean | 8 | “bool” |
| Date | 9 | “date” |
| Null | 10 | “null” |
| Regular | 11 | “regex” |
| JavaScript | 13 | “javascript” |
| 32-bit integer | 16 | “int” |
| Timestamp | 17 | “timestamp” |
| 64-bit integer | 18 | “long” |
| Decimal128 | 19 | “decimal” |
| Min key | -1 | “minKey” |
| Max key | 127 | “maxKey” |
Ví dụ 1: zipCode kiểu string
db.product_delivery.find({ "zipCode": { $type: 2 } })

Ví dụ 2: zipCode kiểu integer
db.product_delivery.find({ "zipCode": { $type: 16 } })

Array Operators
Toán tử mảng được sử dụng khi người dùng muốn lọc dữ liệu dựa trên điều kiện của field dạng mảng.
Có ba toán tử mảng:
$all$elemMatch$size
$all Operator
Cú pháp:
{ <field>: { $all: [<value1>, <value2>, ...] } }
Ví dụ:
Xem các document có cả “Food” và “electronics” trong field delivered:
db.product_delivery.find({ delivered: { $all:["Food","electronics"] } })

$elemMatch Operator
Cú pháp:
{ <field>: { $elemMatch: { <query1>, <query2>, ... } } }
Ví dụ:
Xem document có Feedback chứa:
- product = “xyz”
- score ≥ 8
db.product_delivery.find({
Feedback: {
$elemMatch: { product:"xyz", score:{ $gte:8 } }
}
})

$size Operator
Cú pháp:
{ <field>: { $size: n } }
Ví dụ:
Xem document có mảng delivered chứa 4 phần tử:
db.product_delivery.find({ delivered: { $size:4 } })

Projection Operators
Hàm find() trong MongoDB trả về tất cả dữ liệu thỏa điều kiện.
Nhưng nếu người dùng chỉ muốn xem một số field cụ thể, thì cần sử dụng projection operators.
Projection operators cho phép chỉ định các field hoặc phần tử được hiển thị trong kết quả truy vấn dựa trên điều kiện.
Bốn toán tử projection trong MongoDB:
| Operator | Chức năng |
|---|---|
$ | Trả về phần tử đầu tiên trong mảng thỏa điều kiện truy vấn |
$elemMatch | Trả về phần tử đầu tiên trong mảng thỏa điều kiện của $elemMatch |
$meta | Truy xuất metadata liên quan đến document |
$slice | Chỉ định số phần tử mảng được trả về |
$ Operator (Projection)
Cú pháp:
db.collection.find(
{ <array>: <condition> },
{ "<array>.$": 1 }
)
Ví dụ
Tạo database Student_detail và chuyển sang database đó:
use Student_detail
Hình 3.16 hiển thị việc chuyển database.
Tạo collection Studentmarks và chèn dữ liệu:
db.Studentmarks.insertMany([
{ name:"Robert", age:16, sub:1, marks:[89,78,90] },
...
])
Sau khi chèn thêm các document:
{ name: "Oliver", age: 17, sub:1, marks:[78,85,89] },
{ name: "Henry", age: 15, sub:1, marks:[88,89,76] },
{ name: "David", age: 16, sub:2, marks:[86,84,66] }

insertMany.Truy vấn sử dụng $ projection operator
Giả sử người dùng muốn:
- Xem phần tử đầu tiên ≥ 85 trong mảng
marks - Với điều kiện
sub = 1 - Chỉ hiển thị
name - Ẩn
_id
Truy vấn:
db.Studentmarks.find(
{ sub:1, marks:{ $gte:85 } },
{ _id:0, name:1, "marks.$":1 }
)
Giải thích:
"marks.$":1→ chỉ hiển thị phần tử đầu tiên của mảng thỏa điều kiện_id:0→ ẩn cột_id

$slice Operator (Projection)
Cú pháp:
db.collection.find(<query>,
{ <arrayField>: { $slice: <number> } })
Ví dụ:
Xem 2 phần tử đầu tiên của mảng marks với name = "Robert":
db.Studentmarks.find(
{ "name":"Robert" },
{ "marks": { $slice:2 } }
)

Update Operators
(Toán tử cập nhật)
Update operators giúp người dùng chỉnh sửa document trong collection.
Có hai nhóm:
- Field update operators
- Array update operators
Field Update Operators
MongoDB có 9 toán tử cập nhật field:
| Operator | Chức năng |
|---|---|
$currentDate | Gán ngày hiện tại |
$inc | Tăng giá trị theo số chỉ định |
$min | Cập nhật nếu giá trị mới nhỏ hơn |
$max | Cập nhật nếu giá trị mới lớn hơn |
$mul | Nhân với giá trị chỉ định |
$rename | Đổi tên field |
$set | Gán giá trị |
$unset | Xóa field |
$setOnInsert | Chỉ set khi insert |
$currentDate Operator
Cú pháp:
{ $currentDate: { <field>: <typeSpecification>, ... } }
<typeSpecification> có thể:
- true → lưu kiểu Date
- “timestamp”
- “date”
Lưu ý: phải viết chữ thường.
Nếu field không tồn tại, MongoDB sẽ tự tạo.
Ví dụ:
Cập nhật Exam_Date của "David" thành ngày hiện tại:
db.Studentmarks.updateOne(
{ "name":"David" },
{ $currentDate:{ Exam_Date:true } }
)

Xem lại:
db.Studentmarks.find()

$inc Operator
Cú pháp:
{ $inc: { <field1>: <amount1>, ... } }
Ví dụ:
Tăng age của "Henry" thêm 2:
db.Studentmarks.updateOne(
{ name:"Henry" },
{ $inc:{ age:2 } }
)

Xem lại:
db.Studentmarks.find({ "name":"Henry" })

$set Operator
Cú pháp:
{ $set: { <field>: <value>, ... } }
Ví dụ:
Thêm field credit vào tất cả document:
db.Studentmarks.updateMany(
{},
{ $set:{ credit:0 } }
)

Xem lại:
db.Studentmarks.find()

$rename Operator
Cú pháp:
{ $rename: { <oldField>: <newField>, ... } }
Lưu ý: tên mới phải khác tên cũ.
Ví dụ:
Đổi credit thành unit:
db.Studentmarks.updateOne(
{ name:"David" },
{ $rename:{ "credit":"unit" } }
)

Xem lại:
db.Studentmarks.find({ "name":"David" })

Array Update Operators
Các toán tử cập nhật mảng gồm:
| Operator | Chức năng |
|---|---|
$ | Cập nhật phần tử đầu tiên thỏa điều kiện |
$[] | Cập nhật tất cả phần tử |
$addToSet | Thêm phần tử nếu chưa tồn tại |
$pop | Xóa phần tử đầu hoặc cuối |
$pull | Xóa phần tử thỏa điều kiện |
$push | Thêm phần tử |
$pullAll | Xóa tất cả phần tử khớp giá trị |
$pop Operator
Cú pháp:
{ $pop: { <field>: -1 | 1 } }
- -1 → xóa phần tử đầu
- 1 → xóa phần tử cuối
Ví dụ với $pop Operator
Giả sử trong collection Studentmarks, người dùng muốn xóa phần tử đầu tiên trong mảng marks của document có name = "Oliver".
Truy vấn:
db.Studentmarks.updateOne(
{ "name": "Oliver" },
{ $pop: { marks: -1 } }
)
- Giá trị
-1→ xóa phần tử đầu tiên - Giá trị
1→ xóa phần tử cuối cùng

Xem lại document:
db.Studentmarks.find({ "name": "Oliver" })

$pull Operator
Cú pháp:
{ $pull: { <field>: <value | condition>, ... } }
Toán tử $pull dùng để xóa phần tử trong mảng nếu phần tử đó thỏa điều kiện.
Ví dụ
Xóa phần tử có giá trị 85 trong mảng marks của "Oliver":
db.Studentmarks.updateOne(
{ name: "Oliver" },
{ $pull: { marks: { $in: [85] } } }
)

Xem lại document:
db.Studentmarks.find({ "name": "Oliver" })

$push Operator
Cú pháp:
{ $push: { <field>: <value>, ... } }
Dùng để thêm phần tử vào mảng.
Ví dụ
Thêm giá trị 99 vào mảng marks của "Oliver":
db.Studentmarks.updateOne(
{ "name": "Oliver" },
{ $push: { marks: 99 } }
)

Xem lại:
db.Studentmarks.find({ "name": "Oliver" })

Các toán tử khác
Ba toán tử khác thường dùng trong MongoDB:
| Operator | Chức năng |
|---|---|
$comment | Thêm chú thích cho truy vấn |
$rand | Sinh số ngẫu nhiên từ 0 đến 1 |
$natural | Xác định thứ tự duyệt document |
$comment Operator
Cú pháp:
db.collection.find(
{ <query> },
{ $comment: <comment> }
)
Ví dụ
Thêm comment cho truy vấn tìm "Robert":
db.Studentmarks.find(
{ "name": "Robert" },
{ $comment: "Displaying Robert mark details" }
)

Lưu ý:
Comment không hiển thị trong kết quả vì nó được lưu trong collection system.profile nếu profiling được bật.
Có thể xem bằng:
db.system.profile.find()
$rand Operator
Cú pháp:
{ $rand: {} }
Toán tử này tạo số ngẫu nhiên từ 0 đến 1.
Ví dụ
Cập nhật field unit bằng số ngẫu nhiên:
- Nhân với 100
- Làm tròn lên (ceil)
db.Studentmarks.updateMany(
{},
[{
$set: {
unit: {
$ceil: { $multiply: [ { $rand: {} }, 100 ] }
}
}
}]
)
- Bộ lọc
{}→ áp dụng cho tất cả document

Xem lại:
db.Studentmarks.find()

Giải thích kết quả:
- Field
unitđược cập nhật bằng số ngẫu nhiên cho tất cả document. - Document
"David"đã có fieldunit(đổi từcreditbằng$rename), nên giá trị được cập nhật. - Các document khác được tạo mới field
unit.
$natural Operator
Toán tử $natural dùng để xác định thứ tự duyệt document:
1→ thứ tự tự nhiên-1→ thứ tự ngược
Cú pháp:
db.collection.find().sort({ $natural: 1 })
Hoặc:
db.collection.find().sort({ $natural: -1 })
Ví dụ
Duyệt document theo thứ tự tự nhiên:
db.Studentmarks.find().sort({ $natural: 1 })
Duyệt document theo thứ tự ngược:
db.Studentmarks.find().sort({ $natural: -1 })
Bài tập
Thực hành (Try It Yourself)
-
Tạo một cơ sở dữ liệu (database) có tên Student và một collection có tên Stud_mark.
-
Chèn bốn document sau vào collection Stud_mark:
[
{
name: "Adam",
gender: "M",
subjects: ["Java", "C", "Python"],
marks: [89, 78, 90],
average: 85.6
},
{
name: "Franklin",
gender: "M",
subjects: ["C", "VB", "Python"],
marks: [78, 85, 89],
average: 84
},
{
name: "Michael",
gender: "M",
subjects: ["Java", "PHP"],
marks: [88, 89],
average: 88.5
},
{
name: "Amelia",
gender: "F",
subjects: ["Ruby", "C++"],
marks: [86, 87],
average: 86.5
}
]
Sử dụng collection stud_mark, thực hiện các yêu cầu sau:
-
Tìm các document có giá trị average bằng 84.
-
Tìm các document có giá trị average lớn hơn 85.
-
Hiển thị các document mà mảng subjects chứa Java hoặc C++.
-
Xem các document có average lớn hơn hoặc bằng 87 và nhỏ hơn hoặc bằng 90.
-
Xem tất cả các document mà mảng subjects có chứa giá trị "Java".



