1. Tổng quan
Nâng cấp là sự kết hợp của chèn và cập nhật (inSERT + UPdate =upert). Chúng tôi có thể sử dụng upsert với các phương pháp cập nhật khác nhau, tức là cập nhật , findAndModify và ReplaceOne .
Đây trong MongoDB, upert tùy chọn là một Boolean giá trị. Giả sử giá trị là true và các tài liệu phù hợp với bộ lọc truy vấn được chỉ định. Trong trường hợp đó, thao tác cập nhật được áp dụng sẽ cập nhật tài liệu. Nếu giá trị là true và không có tài liệu nào phù hợp với điều kiện, tùy chọn này sẽ chèn một tài liệu mới vào bộ sưu tập. Tài liệu mới sẽ chứa các trường dựa trên bộ lọc và các hoạt động được áp dụng.
Trong hướng dẫn này, trước tiên chúng ta sẽ xem xét nâng cấp trong truy vấn MongoDB Shell và sau đó sử dụng mã trình điều khiển Java.
2. Khởi tạo cơ sở dữ liệu
Trước khi chúng tôi tiếp tục thực hiện nâng cấp hoạt động, trước tiên chúng ta cần thiết lập cơ sở dữ liệu mới baeldung và một bộ sưu tập mẫu, xe :
db.vehicle.insertMany([
{
"companyName":"Nissan",
"modelName":"GTR",
"launchYear":2016,
"type":"Sports",
"registeredNo":"EPS 5561"
},
{
"companyName":"BMW",
"modelName":"X5",
"launchYear":2020,
"type":"SUV",
"registeredNo":"LLS 6899"
},
{
"companyName":"Honda",
"modelName":"Gold Wing",
"launchYear":2018,
"type":"Bike",
"registeredNo":"LKS 2477"
}]);
Trong trường hợp chèn thành công, lệnh trên sẽ in ra một JSON tương tự như lệnh được hiển thị bên dưới:
{
"acknowledged" : true,
"insertedIds" : [
ObjectId("623c1db39d55d4e137e4781b"),
ObjectId("623c1db39d55d4e137e4781c"),
ObjectId("623c1db39d55d4e137e4781d")
]
}
Chúng tôi đã thêm thành công dữ liệu giả vào bộ sưu tập xe .
3. Sử dụng cập nhật Phương pháp
Trong phần này, chúng ta sẽ học cách sử dụng nâng cấp với tùy chọn cập nhật phương pháp. Mục đích chính của nâng cấp tùy chọn là cập nhật tài liệu hiện có dựa trên bộ lọc được áp dụng hoặc chèn tài liệu mới nếu bộ lọc không khớp .
Để minh họa, chúng tôi sẽ sử dụng $ setOnInsert toán tử với upert để có thêm lợi thế khi chèn các trường mới vào tài liệu.
Hãy kiểm tra một truy vấn trong đó điều kiện bộ lọc khớp với tài liệu hiện có của bộ sưu tập:
db.vehicle.update(
{
"modelName":"X5"
},
{
"$set":{
"companyName":"Hero Honda"
}
},
{
"upsert":true
});
Truy vấn trên sẽ trả về tài liệu sau:
{
"nMatched" : 1,
"nUpserted" : 0,
"nModified" : 1
}
Tại đây, chúng ta sẽ thấy mã trình điều khiển Java tương ứng với truy vấn trình bao mongo ở trên:
UpdateOptions options = new UpdateOptions().upsert(true);
UpdateResult updateResult = collection.updateOne(Filters.eq("modelName", "X5"),
Updates.combine(Updates.set("companyName", "Hero Honda")), options);
System.out.println("updateResult:- " + updateResult);
Trong truy vấn trên, trường modelName “X5” đã tồn tại trong bộ sưu tập, vì vậy trường companyName tài liệu đó sẽ được cập nhật thành “Hero Honda”.
Bây giờ, hãy xem một ví dụ về upsert tùy chọn sử dụng $ setOnInsert nhà điều hành. Nó sẽ chỉ được áp dụng trong trường hợp thêm tài liệu mới:
db.vehicle.update(
{
"modelName":"GTPR"
},
{
"$set":{
"companyName":"Hero Honda"
},
"$setOnInsert":{
"launchYear" : 2022,
"type" : "Bike",
"registeredNo" : "EPS 5562"
},
},
{
"upsert":true
});
Truy vấn trên sẽ trả về tài liệu sau:
{
"nMatched" : 0,
"nUpserted" : 1,
"nModified" : 0,
"_id" : ObjectId("623b378ed648af670fe50e7f")
}
Mã trình điều khiển Java của truy vấn cập nhật ở trên với $ setOnInsert tùy chọn sẽ là:
UpdateResult updateSetOnInsertResult = collection.updateOne(Filters.eq("modelName", "GTPR"),
Updates.combine(Updates.set("companyName", "Hero Honda"),
Updates.setOnInsert("launchYear", 2022),
Updates.setOnInsert("type", "Bike"),
Updates.setOnInsert("registeredNo", "EPS 5562")), options);
System.out.println("updateSetOnInsertResult:- " + updateSetOnInsertResult);
Ở đây, trong truy vấn ở trên, điều kiện lọc của trường modelName “GTPR” không khớp với bất kỳ tài liệu bộ sưu tập nào, vì vậy chúng tôi sẽ thêm một tài liệu mới vào bộ sưu tập. Điểm quan trọng cần lưu ý là $ setOnInsert thêm tất cả các trường vào tài liệu mới.
4. Sử dụng findAndModify Phương pháp
Chúng tôi cũng có thể sử dụng upsert sử dụng tùy chọn findAndModify phương pháp. Đối với phương pháp này, giá trị mặc định của upsert tùy chọn là sai . Nếu chúng tôi đặt nâng cấp tùy chọn thành đúng , nó sẽ hoạt động chính xác giống như phương pháp cập nhật.
Hãy xem trường hợp sử dụng của findAndModify phương pháp với upsert tùy chọn đúng :
db.vehicle.findAndModify(
{
query:{
"modelName":"X7"
},
update: {
"$set":{
"companyName":"Hero Honda"
}
},
"upsert":true,
"new":true
});
Trong trường hợp này, truy vấn trên sẽ trả về tài liệu mới được tạo. Hãy kiểm tra mã trình điều khiển Java của truy vấn trên:
FindOneAndUpdateOptions upsertOptions = new FindOneAndUpdateOptions();
upsertOptions.returnDocument(ReturnDocument.AFTER);
upsertOptions.upsert(true);
Document resultDocument = collection.findOneAndUpdate(Filters.eq("modelName", "X7"),
Updates.set("companyName", "Hero Honda"), upsertOptions);
System.out.println("resultDocument:- " + resultDocument);
Ở đây, đầu tiên chúng tôi tạo điều kiện bộ lọc và dựa trên đó, chúng tôi sẽ cập nhật tài liệu hiện có hoặc thêm tài liệu mới vào bộ sưu tập xe .
5. Sử dụng ReplaceOne Phương pháp
Hãy thực hiện upert hoạt động bằng cách sử dụng ReplaceOne phương pháp. ReplaceOne phương thức MongoDB chỉ thay thế một tài liệu duy nhất trong bộ sưu tập nếu điều kiện phù hợp.
Đầu tiên, hãy xem xét truy vấn trình bao Mongo của phương thức thay thế:
db.vehicle.replaceOne(
{
"modelName":"GTPR"
},
{
"modelName" : "GTPR",
"companyName" : "Hero Honda",
"launchYear" : 2022,
"type" : "Bike",
"registeredNo" : "EPS 5562"
},
{
"upsert":true
});
Truy vấn trên sẽ trả về phản hồi sau:
{
"acknowledged" : true,
"matchedCount" : 1,
"modifiedCount" : 1
}
Bây giờ, hãy viết truy vấn trên bằng mã trình điều khiển Java:
Document replaceDocument = new Document();
replaceDocument.append("modelName", "GTPP")
.append("companyName", "Hero Honda")
.append("launchYear", 2022)
.append("type", "Bike")
.append("registeredNo", "EPS 5562");
UpdateResult updateReplaceResult = collection.replaceOne(Filters.eq("modelName", "GTPP"), replaceDocument, options);
System.out.println("updateReplaceResult:- " + updateReplaceResult);
Ở đây, trong trường hợp này, trước tiên, chúng tôi cần tạo một tài liệu mới mà chúng tôi muốn thay thế tài liệu hiện có và với upsert tùy chọn đúng , chúng tôi sẽ chỉ thay thế tài liệu nếu điều kiện phù hợp.