MongoDB cung cấp các loại toán tử cập nhật mảng khác nhau để cập nhật giá trị của các trường mảng trong tài liệu và toán tử $addToSet là một trong số đó. Toán tử này được sử dụng để thêm một giá trị vào một mảng và nếu giá trị đã tồn tại trong mảng, thì toán tử này sẽ không làm gì cả
cú pháp
{ $addToSet: { : , .. } }
Here, can specify with dot notation in embedded/nested documents.
- Toán tử này không chèn các mục trùng lặp vào mảng và không ảnh hưởng đến các mục trùng lặp đã có sẵn. Ở đây, thứ tự của các giá trị không quan trọng
- Nếu trường được chỉ định trong toán tử
$addToSet
không có trong tài liệu, thì toán tử này sẽ tạo một trường mảng trong tài liệu với các giá trị hoặc mục - Giá trị được chỉ định có phải là một mảng trong toán tử
$addToSet
không, thì toán tử này sẽ nối toàn bộ mảng dưới dạng một mục. Hoặc nếu bạn muốn thêm các mục riêng biệt trong mảng, thì hãy sử dụng công cụ sửa đổi $each - Toán tử này không hoạt động với các trường không phải mảng
- Nếu giá trị là một tài liệu, thì MongoDB sẽ kiểm tra xem tài liệu có tồn tại hay không trong mảng. Nếu tài liệu đã chỉ định chứa cùng một trường và giá trị và thứ tự của trường cũng giống như tài liệu hiện có, thì tài liệu đã chỉ định là một tài liệu trùng lặp do đó toán tử $addToSet không thêm các tài liệu đó vào mảng
- Bạn có thể sử dụng toán tử này với các phương thức như update[], findAndModify[], v.v. , theo yêu cầu của bạn
Trong các ví dụ sau, chúng tôi đang làm việc với
Cơ sở dữ liệu. GeeksforGeeks
Bộ sưu tập. cộng tác viên
Tài liệu. hai tài liệu chứa thông tin chi tiết về người đóng góp ở dạng cặp trường-giá trị.
Thêm giá trị vào một mảng
Trong ví dụ này, chúng tôi đang thêm nhiều giá trị, tôi. e. , [“Perl”, “Go”, “Ruby”] trong mảng ngôn ngữ với sự trợ giúp của công cụ sửa đổi $each. Ở đây, “Perl” không thêm vào mảng vì nó đã tồn tại
$push là một toán tử cập nhật trong MongoDB để thêm giá trị vào một mảng. Ngược lại, toán tử $set được sử dụng để cập nhật giá trị của một trường hiện có trong tài liệu
Trong hướng dẫn ngắn này, chúng tôi sẽ giới thiệu cách thực hiện các thao tác $push và $set cùng nhau trong một truy vấn cập nhật duy nhất
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 nhiều thao tác cập nhật, trước tiên chúng tôi cần thiết lập cơ sở dữ liệu baeldung và nhãn hiệu thu thập mẫu
use baeldung;
db.createCollection[marks];
Hãy chèn một vài tài liệu vào các dấu sưu tập bằng cách sử dụng phương thức insertMany của MongoDB
db.marks.insertMany[[
{
"studentId": 1023,
"studentName":"James Broad",
"joiningYear":"2018",
"totalMarks":100,
"subjectDetails":[
{
"subjectId":123,
"subjectName":"Operating Systems Concepts",
"marks":40
},
{
"subjectId":124,
"subjectName":"Numerical Analysis",
"marks":60
}
]
},
{
"studentId": 1024,
"studentName":"Chris Overton",
"joiningYear":"2018",
"totalMarks":110,
"subjectDetails":[
{
"subjectId":123,
"subjectName":"Operating Systems Concepts",
"marks":50
},
{
"subjectId":124,
"subjectName":"Numerical Analysis",
"marks":60
}
]
}
]];
Khi chèn thành công, truy vấn trên sẽ trả về phản hồi sau
{
"acknowledged" : true,
"insertedIds" : [
ObjectId["622300cc85e943405d04b567"],
ObjectId["622300cc85e943405d04b568"]
]
}
Cho đến nay, chúng tôi đã chèn thành công một số tài liệu mẫu vào bộ sưu tập nhãn hiệu
3. Hiểu vấn đề
Để hiểu rõ vấn đề, trước tiên chúng ta hãy tìm hiểu tài liệu mà chúng ta vừa đưa vào. Nó bao gồm các chi tiết sinh viên và các điểm họ đạt được trong các môn học khác nhau. Tổng điểm là tổng điểm đạt được ở các môn học khác nhau
Hãy xem xét một tình huống mà chúng tôi muốn thêm một chủ đề mới trong mảng chủ đề Chi tiết. Để làm cho dữ liệu nhất quán, chúng tôi cũng cần cập nhật trường TotalMarks
Trong MongoDB, trước tiên, chúng ta sẽ thêm chủ thể mới vào mảng bằng cách sử dụng toán tử $push. Sau đó, chúng ta sẽ đặt trường totalMarks thành một giá trị cụ thể bằng cách sử dụng toán tử $set
Cả hai thao tác này đều có thể được thực hiện riêng lẻ bằng cách sử dụng toán tử $push và $set tương ứng. Nhưng chúng ta có thể viết truy vấn MongoDB để thực hiện cả hai thao tác cùng nhau
4. Sử dụng truy vấn Shell MongoDB
Trong MongoDB, chúng ta có thể cập nhật nhiều trường của tài liệu bằng các toán tử cập nhật khác nhau. Ở đây, chúng ta sẽ sử dụng đồng thời cả hai toán tử $push và $set trong truy vấn updateOne
Hãy xem ví dụ có chứa cả hai toán tử $push và $set cùng nhau
db.marks.updateOne[
{
"studentId": 1023
},
{
$set: {
totalMarks: 170
},
$push: {
"subjectDetails":{
"subjectId": 126,
"subjectName": "Java Programming",
"marks": 70
}
}
}
];
Ở đây, trong truy vấn trên, chúng tôi đã thêm truy vấn bộ lọc dựa trên studentId. Khi chúng tôi nhận được tài liệu đã lọc, chúng tôi sẽ cập nhật totalMarks bằng cách sử dụng toán tử $set. Ngoài ra, chúng tôi chèn dữ liệu chủ đề mới vào mảng chủ đề Chi tiết bằng cách sử dụng toán tử $push
Kết quả là, truy vấn trên sẽ trả về đầu ra sau
{
"acknowledged":true,
"matchedCount":1,
"modifiedCount":1
}
Tại đây, MatchedCount chứa số lượng tài liệu phù hợp với bộ lọc, trong khi ModifiedCount chứa số lượng tài liệu đã sửa đổi
5. Mã trình điều khiển Java
Cho đến giờ, chúng ta đã thảo luận về truy vấn shell mongo để sử dụng toán tử $push và $set cùng nhau. Ở đây, chúng ta sẽ học cách triển khai tương tự bằng cách sử dụng mã trình điều khiển Java
Trước khi tiếp tục, trước tiên hãy kết nối với DB và bộ sưu tập cần thiết
MongoClient mongoClient = new MongoClient[new MongoClientURI["localhost", 27017];
MongoDatabase database = mongoClient.getDatabase["baeldung"];
MongoCollection collection = database.getCollection["marks"];
Ở đây, chúng tôi đang kết nối với MongoDB, đang chạy ở cổng mặc định cổng 27017 trên localhost
Bây giờ chúng ta hãy xem mã trình điều khiển Java
Document subjectData = new Document[]
.append["subjectId", 126]
.append["subjectName", "Java Programming"]
.append["marks", 70];
UpdateResult updateQueryResult = collection.updateOne[Filters.eq["studentId", 1023],
Updates.combine[Updates.set["totalMarks", 170],
Updates.push["subjectDetails", subjectData]]];
Trong đoạn mã này, chúng tôi đã sử dụng phương thức updateOne, phương thức này chỉ cập nhật một tài liệu duy nhất dựa trên bộ lọc studentId được áp dụng 1023. Sau đó, chúng tôi đã sử dụng Bản cập nhật. kết hợp để thực hiện nhiều thao tác trong một cuộc gọi. Trường totalMarks sẽ được cập nhật thành 170 và một chủ đề tài liệu mớiDữ liệu sẽ được đẩy vào trường mảng “subjectDetails”
6. Sự kết luận
Trong bài viết này, chúng ta đã hiểu trường hợp sử dụng của việc áp dụng nhiều thao tác cùng nhau trong một truy vấn MongoDB duy nhất. Hơn nữa, chúng tôi đã thực hiện tương tự bằng cách sử dụng truy vấn trình bao MongoDB và mã trình điều khiển Java