MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

Đẩy và thiết lập các thao tác trong cùng một bản cập nhật MongoDB

1. Tổng quan

$ push là một toán tử cập nhật trong MongoDB để thêm giá trị trong một mảng. Ngược lại, $ set toán tử được sử dụng để cập nhật giá trị của 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 $ push $ set hoạt động cùng nhau trong một truy vấn cập nhật.

2. Khởi tạo cơ sở dữ liệu

Trước khi tiếp tục thực hiện nhiều thao tác cập nhật, trước tiên chúng ta cần thiết lập cơ sở dữ liệu baeldung và bộ sưu tập mẫu nhãn hiệu :

use baeldung;
db.createCollection(marks);

Hãy chèn một vài tài liệu vào bộ sưu tập nhãn hiệu bằng cách sử dụng insertMany phương thức 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 vài 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 hiểu tài liệu mà chúng ta vừa chèn vào. Nó bao gồm thông tin chi tiết về học sinh và điểm các em đạt được trong các môn học khác nhau. totalMarks là tổng điểm đạt được trong các môn học khác nhau.

Hãy xem xét một tình huống mà chúng ta muốn thêm một chủ đề mới trong subjectDetails mảng. Để làm cho dữ liệu nhất quán, chúng tôi cần cập nhật totalMarks cả lĩnh vực.

Trong MongoDB, trước tiên, chúng tôi sẽ thêm chủ đề mới vào mảng bằng cách sử dụng $ push nhà điều hành. Sau đó, chúng tôi sẽ đặt totalMarks trường thành một giá trị cụ thể bằng cách sử dụng $ set nhà điều hành.

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 $ push $ set toán tử tương ứng. Nhưng chúng ta có thể viết truy vấn MongoDB để thực hiện cả hai hoạt động cùng nhau.

4. Sử dụng MongoDB Shell Query

Trong MongoDB, chúng ta có thể cập nhật nhiều trường của một tài liệu bằng cách sử dụng các toán tử cập nhật khác nhau. Ở đây, chúng tôi sẽ sử dụng cả $ push $ set các toán tử cùng nhau trong một updateOne truy vấn.

Hãy xem ví dụ có chứa cả $ push $ set các toán tử 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 subjectDetails bằng cách sử dụng $ push nhà điều hành.

Kết quả là, truy vấn trên sẽ trả về kết quả sau:

{
    "acknowledged":true,
    "matchedCount":1,
    "modifiedCount":1
}

Đây, Số tiền đã khớp chứa số lượng tài liệu phù hợp với bộ lọc, trong khi Số lượng được sửa đổi chứa số lượng tài liệu đã được sửa đổi.

5. Mã trình điều khiển Java

Cho đến nay, chúng ta đã thảo luận về truy vấn trình bao mongo để sử dụng $ push $ set nhà điều hành với 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 bắt buộc:

MongoClient mongoClient = new MongoClient(new MongoClientURI("localhost", 27017);
MongoDatabase database = mongoClient.getDatabase("baeldung");
MongoCollection<Document> 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 xét 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 updateOne phương pháp 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 trang Updates.combine để 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 lên 170 và một tài liệu mới subjectData sẽ được đẩy đến trường mảng “subjectDetails” .


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Cách dễ dàng quản lý các bản cập nhật cơ sở dữ liệu và các bản vá bảo mật

  2. Ngăn Mongoose tạo thuộc tính _id cho các mục mảng tài liệu con

  3. Tại sao trình điều khiển nút MongoDB tạo hồ sơ cá thể bị lỗi bị phá hủy?

  4. Cách tạo chỉ mục phân biệt chữ hoa chữ thường trong MongoDB

  5. Làm cách nào để định cấu hình MongoDB của tôi để tính đến UTF-8?