Mongodb kéo và addtoset cùng nhau

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

Sự khác biệt giữa addToSet và đẩy trong MongoDB là gì?

Sự khác biệt . If the value already exists in the array, $push will still append the value (resulting in duplicate values). Tuy nhiên, $addToSet chỉ nối thêm giá trị nếu nó chưa tồn tại trong mảng. Do đó, nếu giá trị đã tồn tại, $addToSet sẽ không nối thêm giá trị đó (nó sẽ không làm gì cả).

Việc sử dụng addToSet trong MongoDB là gì?

Toán tử $addToSet thêm một giá trị vào một mảng trừ khi giá trị đó đã có sẵn , trong trường hợp đó $addToSet không làm gì với mảng đó. Toán tử $addToSet có dạng. { $addToSet. {

Làm cách nào để lấy nhiều giá trị trong MongoDB?

MongoDB cung cấp hàm find() được sử dụng để tìm nhiều giá trị hoặc tài liệu từ bộ sưu tập. Phương thức find() trả về một con trỏ của tập kết quả và in tất cả các tài liệu. Để tìm nhiều giá trị, chúng ta có thể sử dụng các thao tác tổng hợp do chính MongoDB cung cấp .

$addToSet là gì?

$addToSet trả về một mảng gồm tất cả các giá trị duy nhất có được từ việc áp dụng một biểu thức cho mỗi tài liệu trong một nhóm . Thứ tự của các phần tử trong mảng được trả về là không xác định. $addToSet có sẵn trong các giai đoạn này. $bucket.