MongoDB là một cơ sở dữ liệu NoSQL hàng đầu, được biết đến với khả năng lưu trữ dữ liệu dưới dạng tài liệu, cung cấp một phương thức linh hoạt và mạnh mẽ để quản lý dữ liệu phi cấu trúc hoặc bán cấu trúc. Điều này làm cho MongoDB trở thành lựa chọn ưu tiên cho nhiều ứng dụng web, dịch vụ đám mây và ứng dụng di động, nơi cần đến sự linh hoạt cao và khả năng mở rộng dễ dàng. Trong môi trường dữ liệu ngày càng đa dạng và phức tạp hiện nay, MongoDB thể hiện tầm quan trọng của mình qua khả năng quản lý lượng lớn dữ liệu, đồng thời cung cấp các công cụ truy vấn mạnh mẽ và hiệu suất cao.
Các toán tử cập nhật (update operators) trong MongoDB đóng một vai trò thiết yếu trong việc sửa đổi và quản lý dữ liệu. Chúng bao gồm một loạt các lệnh cho phép người dùng thực hiện các thao tác cập nhật đa dạng, từ việc thay đổi giá trị của các trường, thêm hoặc xóa các trường, đến việc thao tác với mảng và cấu trúc dữ liệu phức tạp khác. Toán tử cập nhật không chỉ giúp tối ưu hóa việc quản lý dữ liệu bằng cách cung cấp cách thức sửa đổi dữ liệu mà không cần viết lại toàn bộ tài liệu, mà còn hỗ trợ đảm bảo tính toàn vẹn và độ chính xác của dữ liệu. Nhờ có các toán tử cập nhật, MongoDB mang đến cho người dùng khả năng linh hoạt và hiệu quả cao trong việc cập nhật dữ liệu, điều thiết yếu cho việc phát triển ứng dụng nhanh chóng và hiệu quả trong thế giới số ngày nay.
Các Loại Toán Tử Cập Nhật
Trong MongoDB, các toán tử cập nhật được thiết kế để đáp ứng nhu cầu đa dạng của việc sửa đổi dữ liệu, và chúng được phân loại dựa trên chức năng và cách thức hoạt động.
Toán tử Field như $set
và $unset
là những công cụ cơ bản cho việc thêm mới hoặc xóa bỏ các trường trong tài liệu; $set
được sử dụng để thiết lập giá trị cho một trường, trong khi $unset
loại bỏ trường ra khỏi tài liệu.
Toán tử Array bao gồm $push
, $pop
, $pull
, và $addToSet
, mỗi toán tử phục vụ một mục đích riêng biệt trong việc quản lý các phần tử của mảng. $push
thêm một phần tử vào cuối mảng, $pop
loại bỏ phần tử ở đầu hoặc cuối mảng, $pull
xóa tất cả các phần tử trong mảng phù hợp với điều kiện xác định, và $addToSet
thêm một phần tử vào mảng nếu phần tử đó chưa tồn tại.
Toán tử Bitwise như $bit
được dùng để thực hiện các thao tác bit trên giá trị của trường, cho phép sửa đổi dữ liệu ở cấp độ bit, hữu ích trong các tình huống cần xử lý thấp.
Ngoài ra, có một loạt các toán tử khác như $rename
, dùng để đổi tên trường, $inc
để tăng giá trị của trường theo một lượng xác định, và $mul
để nhân giá trị của trường. Mỗi toán tử này đều mang lại các khả năng sửa đổi dữ liệu mạnh mẽ và linh hoạt, giúp MongoDB trở thành một lựa chọn ưu việt cho việc lưu trữ và quản lý dữ liệu NoSQL.
Toán tử Field
- $ currentDate
Nó cập nhật các phần tử của một trường thành ngày hiện tại, dưới dạng Ngày hoặc dấu thời gian. Kiểu dữ liệu mặc định của toán tử này là ngày.
Cú pháp:
{ $currentDate: { <field1>: <typeSpecification1>, ... } }
Ví dụ:
db.books.insertOne( { _id: 1, status: "a", lastModified: purchaseDate("2013-10-02T01:11:18.965Z") } )
- $ inc
Nó làm tăng một hồ sơ theo giá trị được chỉ định.
Cú pháp:
{ $inc: { <field1>: <amount1>, <field2>: <amount2>, ... } }
Ví dụ:
{ _id: 000438, sku: "MongoDB", quantity: 1, metrics: { orders: 2, ratings: 3.5 } }
- $ min
Nó thay đổi giá trị của trường thành một giá trị được chỉ định nếu giá trị được chỉ định nhỏ hơn giá trị hiện tại của tệp.
Cú pháp:
{ $min: { <field1>: <value1>, ... } }
Ví dụ:
{ _id: 0021, highprice: 800, lowprice: 200 } db.books.update( { _id: 0021 }, { $min: { highprice: 500 } } )
- $ max
Nó thay đổi giá trị của trường thành một giá trị được chỉ định nếu giá trị được chỉ định lớn hơn giá trị hiện tại của tệp.
Cú pháp:
{$ max: {<field1>: <value1>, ...}}
Ví dụ:
{ _id: 0021, highprice: 800, lowprice: 200 } db.books.update( { _id: 0021 }, { $max: { highprice: 950 } } )
- $ mul
Nó nhân giá trị của một trường với một số.
Cú pháp:
{$ mul: {<field1>: <number1>, ...}}
Ví dụ:
db.books.update( { _id: 1 }, { $mul: { price: NumberDecimal("180.25"), qty: 2 } } )
- $ rename
Toán tử đổi tên thay đổi tên của một trường.
Cú pháp:
{$ rename: {<field1>: <newName1>, <field2>: <newName2>, ...}}
Ví dụ:
db.books.updateMany( {}, { $rename: { "nmae": "name" } } )
- $ set
Toán tử tập hợp thay đổi giá trị của một trường với giá trị được chỉ định.
Cú pháp:
{$ set: {<field1>: <value1>, ...}}
Ví dụ:
{ _id: 100, sku: "abc123", quantity: 50, instock: true, reorder: false, details: { model: "14Q2", make: "xyz" }, tags: [ "technical", "non technical" ], ratings: [ { by: "ijk", rating: 4 } ] }
- $ setOnInsert
Nếu upsert được đặt thành true, thì nó dẫn đến việc chèn một tài liệu, sau đó toán tử setOnInsert sẽ gán các giá trị được chỉ định cho trường trong tài liệu.
Cú pháp:
db.collection.update( <query>, { $setOnInsert: { <field1>: <value1>, ... } }, { upsert: true } )
- $ unset
Nó loại bỏ một trường được chỉ định.
Cú pháp:
{$ unset: {<field1>: "", ...}}
Ví dụ:
db.products.update( { sku: "unknown" }, { $unset: { quantity: "", instock: "" } }
Toán tử Array
- $
Chúng ta có thể cập nhật một phần tử trong một mảng mà không cần chỉ định rõ ràng vị trí của phần tử.
Cú pháp:
{"<array>. $": value}
Ví dụ:
db.collection.update( { <array>: value ... }, { <update operator>: { "<array>.$" : value } }
- $ []
Toán tử vị trí chỉ ra rằng toán tử cập nhật nên thay đổi tất cả các phần tử trong trường mảng đã cho.
Cú pháp:
{ <update operator>: { "<array>.$[]" : value } }
Ví dụ:
db.collection.updateMany( { <query conditions> }, { <update operator>: { "<array>.$[]" : value } }
- $ [<identifier>]
Nó được gọi là một toán tử vị trí được lọc để xác định các phần tử của mảng.
Cú pháp:
{ <update operator>: { "<array>.$[<identifier>]" : value } }, { arrayFilters: [ { <identifier>: <condition> } ] }
Ví dụ:
db.collection.updateMany( { <query conditions> }, { <update operator>: { "<array>.$[<identifier>]" : value } }, { arrayFilters: [ { <identifier>: <condition> } ] } )
- $ addToSet
Nó thêm một phần tử vào một mảng trừ khi phần tử đó đã có mặt, trong trường hợp đó, toán tử này không làm gì với mảng đó.
Cú pháp:
{$ addToSet: {<field1>: <value1>, ...}}
Ví dụ:
db.books.update( { _id: 1 }, { $addToSet: { tags: "MongoDB" } }
- $ pop
Chúng ta có thể xóa phần tử đầu tiên hoặc cuối cùng của mảng bằng toán tử pop. Chúng ta cần truyền giá trị của pop là -1 để loại bỏ phần tử đầu tiên của một mảng và 1 để loại bỏ phần tử cuối cùng trong một mảng.
Cú pháp:
{$ pop: {<field>: <-1 | 1>, ...}}
Ví dụ:
db.books.update( { _id: 1 }, { $pop: { mongoDB: -1 } } )
- $ pull
Sử dụng toán tử kéo, chúng ta có thể loại bỏ tất cả các trường hợp của một giá trị trong một mảng phù hợp với điều kiện đã chỉ định.
Cú pháp:
{$ pull: {<field1>: <value | condition>, <field2>: <value | condition>, ...}}
Ví dụ:
db.books.update( { }, { $pull: { Development: { $in:["Java", "RDBMS" ] }, Tech: "Cybersecurity" } }, { multi: true } )
- $ push
Nó nối một giá trị được chỉ định vào một mảng.
Cú pháp:
{$ push: {<field1>: <value1>, ...}}
Ví dụ:
db.students.update ({_id: 9}, {$ push: {Score: 91}})
- $ pullAll
Chúng tôi có thể xóa tất cả các phiên bản của thông số kỹ thuật giá trị từ một mảng hiện có bằng toán tử pullAll. Nó loại bỏ các phần tử phù hợp với giá trị được liệt kê.
Cú pháp:
{$ pullAll: {<field1>: [<value1>, <value2> ...], ...}}
Ví dụ:
db.survey.update ({_id: 1}, {$ pullAll: {Score: [0, 5]}})
Toán tử Modifiers
- $ each
Nó được sử dụng với toán tử $ addToSet và toán tử $ push. Nó được sử dụng với toán tử addToSet để thêm nhiều giá trị vào một mảng nếu giá trị đó không tồn tại trong trường.
Cú pháp:
{$ addToSet: {<field>: {$ each: [<value1>, <value2> ...]}}}
Nó được sử dụng với toán tử đẩy để nối nhiều giá trị vào một mảng.
Cú pháp:
{ $push: { <field>: { $each: [ <value1>, <value2> ... ] } } }
Ví dụ:
db.students.update( { name: "Akki" }, { $push: { scores: { $each: [ 90, 92, 85 ] } } } )
- $ position
Nó chỉ định vị trí nơi toán tử đẩy chèn các phần tử bên trong một mảng.
Cú pháp:
{ $push: { <field>: { $each: [ <value1>, <value2>, ... ], $position: <num> } }
Ví dụ:
db.students.update( { _id: 1 }, { $push: { scores: { $each: [ 50, 60, 70 ], $position: 0 } } } )
- $ slice
Công cụ sửa đổi này được sử dụng để giới hạn số lượng phần tử của mảng trong hoạt động đẩy.
Cú pháp:
{ $push: { <field>: { $each: [ <value1>, <value2>, ... ], $slice: <num> } }
Ví dụ:
db.students.update( { _id: 1 }, { $push: { scores: { $each: [ 80, 78, 86 ], $slice: -5 } } } )
- $ sort
Công cụ sửa đổi sắp xếp sắp xếp các giá trị của một mảng trong hoạt động đẩy.
Cú pháp:
{ $push: { <field>: { $each: [ <value1>, <value2>, ... ], $sort: <sort specification> } }
Ví dụ:
db.students.update( { _id: 1 }, { $push: { quizzes: { $each: [ { id: 3, score: 8 }, { id: 4, score: 7 }, { id: 5, score: 6 } ], $sort: { score: 1 } } } } )
Toán tử Bitwise
- $ bit
Toán tử bit cập nhật một trường bằng thao tác bitwise. Nó hỗ trợ các hoạt động bitwise AND, bitwise OR, và bitwise XOR.
Cú pháp:
{ $bit: { <field>: { <and|or|xor>: <int> } } }
Ví dụ:
db.books.update( { _id: 1 }, { $bit: { expdata: { and: price(100) } } } )