1. Tổng quan
Trong hướng dẫn này, chúng ta sẽ xem xét việc thực hiện cập nhật hàng loạt và các hoạt động chèn trong MongoDB. Ngoài ra, MongoDB cung cấp các lệnh gọi API cho phép chèn hoặc truy xuất nhiều tài liệu trong một thao tác duy nhất. MongoDB sử dụng Mảng hoặc Hàng loạt giao diện cải thiện đáng kể hiệu suất cơ sở dữ liệu bằng cách giảm số lượng cuộc gọi giữa máy khách và cơ sở dữ liệu.
Trong hướng dẫn này, chúng ta sẽ xem xét cả các giải pháp sử dụng MongoDB Shell và mã trình điều khiển Java.
Hãy đi sâu vào việc triển khai cập nhật hàng loạt tài liệu trong MongoDB.
2. Khởi tạo cơ sở dữ liệu
Trước hết, chúng ta cần kết nối với shell mongo:
mongo --host localhost --port 27017
Bây giờ, hãy thiết lập cơ sở dữ liệu baeldung và một bộ sưu tập mẫu quần thể :
use baeldung;
db.createCollection(populations);
Hãy thêm một số dữ liệu mẫu vào bộ sưu tập quần thể sử dụng insertMany phương pháp:
db.populations.insertMany([
{
"cityId":1124,
"cityName":"New York",
"countryName":"United States",
"continentName":"North America",
"population":22
},
{
"cityId":1125,
"cityName":"Mexico City",
"countryName":"Mexico",
"continentName":"North America",
"population":25
},
{
"cityId":1126,
"cityName":"New Delhi",
"countryName":"India",
"continentName":"Asia",
"population":45
},
{
"cityId":1134,
"cityName":"London",
"countryName":"England",
"continentName":"Europe",
"population":32
}]);
insertMany ở trên truy vấn sẽ trả về tài liệu sau:
{
"acknowledged" : true,
"insertedIds" : [
ObjectId("623575049d55d4e137e477f6"),
ObjectId("623575049d55d4e137e477f7"),
ObjectId("623575049d55d4e137e477f8"),
ObjectId("623575049d55d4e137e477f9")
]
}
Ở đây, chúng tôi đã chèn bốn tài liệu trong truy vấn trên để thực hiện tất cả các loại hoạt động ghi hàng loạt trong MongoDB.
Cơ sở dữ liệu baeldung đã được tạo thành công và tất cả dữ liệu bắt buộc cũng được chèn vào bộ sưu tập quần thể , vì vậy chúng tôi đã sẵn sàng thực hiện cập nhật hàng loạt.
3. Sử dụng MongoDB Shell Query
Trình tạo hoạt động hàng loạt của MongoDB được sử dụng để tạo danh sách các hoạt động ghi hàng loạt cho một tập hợp duy nhất. Chúng ta có thể khởi tạo các hoạt động hàng loạt theo 2 cách khác nhau. Phương thức initializeOrderedBulkOp được sử dụng để thực hiện các hoạt động hàng loạt trong danh sách có thứ tự các hoạt động ghi. Một trong những hạn chế của initializeOrderedBulkOp là nếu lỗi xảy ra trong khi xử lý bất kỳ hoạt động ghi nào, MongoDB sẽ trả về mà không xử lý các hoạt động ghi còn lại trong danh sách.
Chúng ta có thể sử dụng các phương thức chèn, cập nhật, thay thế và loại bỏ để thực hiện các loại hoạt động khác nhau trong một lệnh gọi DB duy nhất. Như một minh họa, chúng ta hãy xem xét truy vấn hoạt động ghi hàng loạt bằng cách sử dụng MongoDB shell:
db.populations.bulkWrite([
{
insertOne :
{
"document" :
{
"cityId":1128,
"cityName":"Kathmandu",
"countryName":"Nepal",
"continentName":"Asia",
"population":12
}
}
},
{
insertOne :
{
"document" :
{
"cityId":1130,
"cityName":"Mumbai",
"countryName":"India",
"continentName":"Asia",
"population":55
}
}
},
{
updateOne :
{
"filter" :
{
"cityName": "New Delhi"
},
"update" :
{
$set :
{
"status" : "High Population"
}
}
}
},
{
updateMany :
{
"filter" :
{
"cityName": "London"
},
"update" :
{
$set :
{
"status" : "Low Population"
}
}
}
},
{
deleteOne :
{
"filter" :
{
"cityName":"Mexico City"
}
}
},
{
replaceOne :
{
"filter" :
{
"cityName":"New York"
},
"replacement" :
{
"cityId":1124,
"cityName":"New York",
"countryName":"United States",
"continentName":"North America",
"population":28
}
}
}
]);
BulWrite ở trên truy vấn sẽ trả về tài liệu sau:
{
"acknowledged" : true,
"deletedCount" : 1,
"insertedCount" : 2,
"matchedCount" : 3,
"upsertedCount" : 0,
"insertedIds" :
{
"0" : ObjectId("623575f89d55d4e137e477f9"),
"1" : ObjectId("623575f89d55d4e137e477fa")
},
"upsertedIds" : {}
}
Ở đây, trong truy vấn trên, chúng tôi đã thực hiện tất cả các loại hoạt động ghi, tức là insertOne , updateOne , deleteOne , ReplaceOne .
Đầu tiên, chúng tôi sử dụng insertOne để chèn một tài liệu mới vào bộ sưu tập. Thứ hai, chúng tôi đã sử dụng updateOne để cập nhật tài liệu của cityName "New Delhi". Sau đó, chúng tôi đã sử dụng deleteOne phương pháp xóa tài liệu khỏi bộ sưu tập dựa trên bộ lọc. Cuối cùng, chúng tôi đã sử dụng ReplaceOne để thay thế một tài liệu hoàn chỉnh bằng bộ lọc cityName “New York”.
4. Sử dụng trình điều khiển Java
Chúng ta đã thảo luận về truy vấn trình bao MongoDB để thực hiện các hoạt động ghi hàng loạt. Trước khi tạo thao tác ghi hàng loạt, trước tiên hãy tạo MongoClient kết nối với bộ sưu tập quần thể của cơ sở dữ liệu baeldung :
MongoClient mongoClient = new MongoClient("localhost", 27017);
MongoDatabase database = mongoClient.getDatabase("baeldung");
MongoCollection<Document> collection = database.getCollection("populations");
Ở đây, chúng tôi đã tạo kết nối với máy chủ MongoDB, chạy trên cổng mặc định 27017. Bây giờ, hãy triển khai các hoạt động hàng loạt giống nhau bằng mã Java:
List<WriteModel<Document>> writeOperations = new ArrayList<WriteModel<Document>>();
writeOperations.add(new InsertOneModel<Document>(new Document("cityId", 1128)
.append("cityName", "Kathmandu")
.append("countryName", "Nepal")
.append("continentName", "Asia")
.append("population", 12)));
writeOperations.add(new InsertOneModel<Document>(new Document("cityId", 1130)
.append("cityName", "Mumbai")
.append("countryName", "India")
.append("continentName", "Asia")
.append("population", 55)));
writeOperations.add(new UpdateOneModel<Document>(new Document("cityName", "New Delhi"),
new Document("$set", new Document("status", "High Population"))
));
writeOperations.add(new UpdateManyModel<Document>(new Document("cityName", "London"),
new Document("$set", new Document("status", "Low Population"))
));
writeOperations.add(new DeleteOneModel<Document>(new Document("cityName", "Mexico City")));
writeOperations.add(new ReplaceOneModel<Document>(new Document("cityId", 1124),
new Document("cityName", "New York").append("cityName", "United States")
.append("continentName", "North America")
.append("population", 28)));
BulkWriteResult bulkWriteResult = collection.bulkWrite(writeOperations);
System.out.println("bulkWriteResult:- " + bulkWriteResult);
Ở đây, đầu tiên chúng tôi tạo danh sách writeModel để thêm tất cả các loại thao tác ghi khác nhau vào một danh sách cập nhật duy nhất. Hơn nữa, chúng tôi đã sử dụng InsertOneModel , UpdateOneModel , UpdateManyModel , DeleteOneModel và ReplaceOneModel trong truy vấn của chúng tôi. Cuối cùng, BulWrite thực hiện tất cả các hoạt động cùng một lúc.