1. Tổng quan
MongoDB là một cơ sở dữ liệu NoSQL đa nền tảng, hướng tài liệu, mã nguồn mở, được viết bằng C ++. Ngoài ra, MongoDB cung cấp hiệu suất cao, tính khả dụng cao và mở rộng quy mô tự động.
Để cập nhật tài liệu trong MongoDB, chúng tôi có thể sử dụng các phương pháp khác nhau như updateOne , findOneAndUpdate, v.v ... Hơn nữa, MongoDB cung cấp các toán tử khác nhau cho các phương pháp cập nhật.
Trong hướng dẫn này, chúng ta sẽ thảo luận về các cách tiếp cận khác nhau để thực hiện các thao tác cập nhật trong MongoDB. Đối với mỗi cách tiếp cận, trước tiên chúng ta sẽ thảo luận về truy vấn mongo shell và sau đó là việc triển khai nó trong Java.
2. Thiết lập cơ sở dữ liệu
Trước khi chuyển sang truy vấn cập nhật, trước tiên hãy tạo cơ sở dữ liệu, baeldung và một bộ sưu tập mẫu, sinh viên:
use baeldung;
db.createCollection(student);
Để minh họa, hãy thêm một vài tài liệu vào bộ sưu tập sinh viên bằng cách sử dụng insertMany truy vấn:
db.student.insertMany([
{
"student_id": 8764,
"student_name": "Paul Starc",
"address": "Hostel 1",
"age": 16,
"roll_no":199406
},
{
"student_id": 8765,
"student_name": "Andrew Boult",
"address": "Hostel 2",
"age": 18,
"roll_no":199408
}
]);
Khi chèn thành công, chúng tôi sẽ nhận được JSON với Recognition:true :
{
"acknowledged" : true,
"insertedIds" : [
ObjectId("621b078485e943405d04b557"),
ObjectId("621b078485e943405d04b558")
]
}
Bây giờ chúng ta hãy đi sâu vào các cách khác nhau để cập nhật tài liệu trong MongoDB.
3. Sử dụng updateOne Phương pháp
Thao tác cập nhật trong MongoDB có thể được thực hiện bằng cách thêm trường mới, xóa trường hoặc cập nhật trường hiện có. The updateOne phương pháp cập nhật một tài liệu duy nhất trong một bộ sưu tập dựa trên bộ lọc truy vấn được áp dụng. Đầu tiên, nó tìm tài liệu phù hợp với bộ lọc và sau đó cập nhật các trường được chỉ định.
Ngoài ra, chúng tôi có thể sử dụng các toán tử khác nhau, chẳng hạn như $ set , $ unset , $ inc , v.v., với phương pháp cập nhật.
Để chứng minh, hãy xem xét truy vấn để cập nhật một tài liệu duy nhất của bộ sưu tập:
db.student.updateOne(
{
"student_name" : "Paul Starc"
},
{
$set: {
"address" : "Hostel 2"
}
}
);
Chúng tôi sẽ nhận được một đầu ra tương tự như đầu ra được hiển thị bên dưới:
{
"acknowledged":true,
"matchedCount":1,
"modifiedCount":1
}
Bây giờ chúng ta hãy kiểm tra mã trình điều khiển Java của updateOne ở trên truy vấn:
UpdateResult updateResult = collection.updateOne(Filters.eq("student_name", "Paul Starc"),
Updates.set("address", "Hostel 2"));
Ở đây, trước tiên, chúng tôi đã sử dụng student_name trường để lọc các tài liệu. Sau đó, chúng tôi cập nhật địa chỉ của tài liệu với student_name “Paul Starc”.
4. Sử dụng updateMany Phương pháp
The updateMany phương thức cập nhật tất cả các tài liệu trong bộ sưu tập MongoDB phù hợp với bộ lọc đã cho. Một trong những lợi ích của việc sử dụng updateMany là chúng tôi có thể cập nhật nhiều tài liệu mà không làm mất các trường của tài liệu cũ.
Hãy xem truy vấn trình bao MongoDB sử dụng updateMany phương pháp:
db.student.updateMany(
{
age: {
$lt: 20
}
},
{
$set:{
"Review" : true
}
}
);
Lệnh trên sẽ trả về kết quả sau:
{
"acknowledged":true,
"matchedCount":2,
"modifiedCount":2
}
Đây, matchCount chứa số lượng tài liệu phù hợp, trong khi Số lượng được sửa đổi chứa số tài liệu đã sửa đổi.
Bây giờ chúng ta hãy xem xét mã trình điều khiển Java bằng cách sử dụng updateMany phương pháp:
UpdateResult updateResult = collection.updateMany(Filters.lt("age", 20), Updates.set("Review", true));
Đây, tất cả các tài liệu có tuổi ít hơn 20 sẽ được lọc và Đánh giá trường sẽ được đặt thành true .
5. Sử dụng ReplaceOne Phương pháp
ReplaceOne phương thức MongoDB thay thế toàn bộ tài liệu. Một trong những hạn chế của ReplaceOne là tất cả các trường cũ hơn sẽ được thay thế bằng các trường mới và các trường cũ hơn cũng sẽ bị mất:
db.student.replaceOne(
{
"student_id": 8764
},
{
"student_id": 8764,
"student_name": "Paul Starc",
"address": "Hostel 2",
"age": 18,
"roll_no":199406
}
);
Trong trường hợp này, chúng tôi sẽ nhận được kết quả sau:
{
"acknowledged":true,
"matchedCount":1,
"modifiedCount":1
}
Nếu không tìm thấy kết quả phù hợp nào, thao tác trả về Số tiền đã khớp dưới dạng 0:
{
"acknowledged":true,
"matchedCount":0,
"modifiedCount":0
}
Hãy viết mã trình điều khiển Java tương ứng bằng cách sử dụng ReplaceOne phương pháp:
Document replaceDocument = new Document();
replaceDocument
.append("student_id", 8764)
.append("student_name", "Paul Starc")
.append("address", "Hostel 2")
.append("age",18)
.append("roll_no", 199406);
UpdateResult updateResult = collection.replaceOne(Filters.eq("student_id", 8764), replaceDocument);
Trong đoạn mã trên, chúng tôi đã tạo một tài liệu mà tài liệu cũ hơn sẽ được thay thế. Tài liệu có student_id 8764 sẽ được thay thế bằng tài liệu mới được tạo.
6. Sử dụng findOneAndReplace Phương pháp
findOneAndReplace là một trong những phương pháp cập nhật nâng cao do MongoDB cung cấp và nó thay thế tài liệu phù hợp đầu tiên dựa trên các tiêu chí lựa chọn đã cho. Theo mặc định, phương thức này trả về tài liệu gốc. Chúng tôi có thể sử dụng các tùy chọn khác nhau của findOneAndReplace để sắp xếp và chiếu các tài liệu nếu được yêu cầu.
Nói tóm lại, findOneAndReplace thay thế tài liệu phù hợp đầu tiên của bộ sưu tập trên cơ sở bộ lọc được áp dụng:
db.student.findOneAndReplace(
{
"student_id" : {
$eq : 8764
}
},
{
"student_id" : 8764,
"student_name" : "Paul Starc",
"address": "Hostel 2",
"age": 18,
"roll_no":199406
},
{
returnNewDocument: false
}
);
Truy vấn này sẽ trả về tài liệu sau:
{
"student_id":8764,
"student_name":"Paul Starc",
"address":"Hostel 1",
"age":16,
"roll_no":199406
}
Nếu chúng tôi đặt returnNewDocument thành đúng , thao tác sau đó sẽ trả về tài liệu được thay thế để thay thế:
{
"student_id":8764,
"student_name":"Paul Starc",
"address":"Hostel 2",
"age":18,
"roll_no":199406
}
Bây giờ hãy sử dụng findOneAndReplace phương pháp để chiếu student_id và tuổi các trường trong tài liệu trả về:
db.student.findOneAndReplace(
{
"student_id" : {
$eq : 8764
}
},
{
"student_id" : 8764,
"student_name" : "Paul Starc",
"address": "Hostel 2",
"age": 18,
"roll_no":199406
},
{
projection: {
"_id" : 0,
"student_id":1,
"age" : 1
}
}
);
Đầu ra của truy vấn trên sẽ chỉ chứa các trường dự kiến:
{
"student_id":"8764",
"age":16
}
Mã trình điều khiển Java của truy vấn trên với các tùy chọn khác nhau của findOneAndReplace:
Document replaceDocument = new Document();
replaceDocument
.append("student_id", 8764)
.append("student_name", "Paul Starc")
.append("address", "Hostel 2")
.append("age", 18)
.append("roll_no", 199406);
Document sort = new Document("roll_no", 1);
Document projection = new Document("_id", 0).append("student_id", 1).append("address", 1);
Document resultDocument = collection.findOneAndReplace(
Filters.eq("student_id", 8764),
replaceDocument,
new FindOneAndReplaceOptions().upsert(true).sort(sort).projection(projection).returnDocument(ReturnDocument.AFTER));
Trong truy vấn trên, findOneAndReplace trước tiên phương thức sẽ sắp xếp tài liệu theo thứ tự tăng dần dựa trên roll_no, và tài liệu mới được tạo sẽ thay thế tài liệu bằng student_id “8764”.
7. Sử dụng findOneAndUpdate Phương pháp
findOneAndUpdate phương pháp cập nhật tài liệu phù hợp đầu tiên trong bộ sưu tập. Nếu nhiều tài liệu phù hợp với tiêu chí lựa chọn, thì nó chỉ cập nhật tài liệu phù hợp đầu tiên. Khi chúng tôi cập nhật tài liệu, giá trị của _id trường vẫn không thay đổi:
db.student.findOneAndUpdate(
{
"student_id" : 8764
},
{
$inc : {
"roll_no" : 5
}
},
{
sort: {
"roll_no" : 1
},
projection: {
"_id" : 0,
"student_id":1,
"address" : 1
}
}
);
Đầu ra của truy vấn sẽ chỉ chứa studentId và địa chỉ của tài liệu cũ hơn:
{
"student_id":8764,
"address":"Hostel 1"
}
Mã trình điều khiển Java của truy vấn trên, sử dụng các tùy chọn khác nhau của findOneAndUpdate như sau :
Document sort = new Document("roll_no", 1);
Document projection = new Document("_id", 0).append("student_id", 1).append("address", 1);
Document resultDocument = collection.findOneAndUpdate(
Filters.eq("student_id", 8764),
Updates.inc("roll_no", 5),
new FindOneAndUpdateOptions().sort(sort).projection(projection).returnDocument(ReturnDocument.BEFORE));
Trong trường hợp này, findOneAndUpdate phương thức đầu tiên sẽ sắp xếp tài liệu theo thứ tự tăng dần dựa trên roll_no . Truy vấn trên tăng roll_no bằng 5 rồi trả về student_id và địa chỉ các lĩnh vực.