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

Cập nhật nhiều trường trong tài liệu MongoDB

1. Tổng quan

MongoDB là một cơ sở dữ liệu NoSQL hướng tài liệu được cung cấp công khai. Chúng tôi có thể cập nhật các tài liệu trong bộ sưu tập bằng nhiều phương pháp khác nhau như cập nhật , thay thế lưu . Để thay đổi một trường cụ thể của tài liệu, chúng tôi sẽ sử dụng các toán tử khác nhau như $ set , $ inc, vv

Trong hướng dẫn này, chúng ta sẽ tìm hiểu cách sửa đổi nhiều trường của tài liệu bằng cách sử dụng update thay thế truy vấn. Đối với mục đích trình diễn, trước tiên chúng ta sẽ thảo luận về truy vấn trình bao mongo và sau đó là cách triển khai tương ứng của nó trong Java.

Bây giờ chúng ta hãy xem xét các phương pháp khác nhau để đạt được mục đích.

2. Truy vấn Shell để cập nhật các trường khác nhau

Trước khi bắt đầu, trước tiên chúng ta hãy tạo một cơ sở dữ liệu mới, baeldung và một bộ sưu tập mẫu, nhân viên . Chúng tôi sẽ sử dụng bộ sưu tập này trong tất cả các ví dụ:

use baeldung;
db.createCollection(employee);

Bây giờ, hãy thêm một vài tài liệu vào bộ sưu tập này bằng cách sử dụng insertMany truy vấn:

db.employee.insertMany([
    {
        "employee_id": 794875,
        "employee_name": "David Smith",
        "job": "Sales Representative",
        "department_id": 2,
        "salary": 20000,
        "hire_date": NumberLong("1643969311817")
    },
    {
        "employee_id": 794876,
        "employee_name": "Joe Butler",
        "job": "Sales Manager",
        "department_id": 3,
        "salary": 30000,
        "hire_date": NumberLong("1645338658000")
    }
]);

Kết quả là, chúng tôi sẽ nhận được JSON với ObjectId cho cả hai tài liệu như được hiển thị bên dưới:

{
    "acknowledged": true,
    "insertedIds": [
        ObjectId("6211e034b76b996845f3193d"),
        ObjectId("6211e034b76b996845f3193e")
        ]
}

Cho đến nay, chúng tôi đã thiết lập môi trường cần thiết. Bây giờ hãy cập nhật các tài liệu mà chúng tôi vừa chèn vào.

2.1. Cập nhật nhiều trường của một tài liệu duy nhất

Chúng tôi có thể sử dụng $ set $ inc để cập nhật bất kỳ trường nào trong MongoDB. $ set toán tử sẽ đặt giá trị mới được chỉ định trong khi $ inc toán tử sẽ tăng giá trị theo một giá trị được chỉ định.

Trước tiên, hãy xem xét truy vấn MongoDB để cập nhật hai trường của bộ sưu tập nhân viên bằng cách sử dụng $ set nhà điều hành:

db.employee.updateOne(
    {
        "employee_id": 794875,
        "employee_name": "David Smith"
    },
    {
        $set:{
            department_id:3,
            job:"Sales Manager"
        }
    }
);

Trong truy vấn ở trên, worker_id tên_nhân_viên được sử dụng để lọc tài liệu và $ set toán tử được sử dụng để cập nhật job Department_id các lĩnh vực.

Chúng tôi cũng có thể sử dụng $ set $ inc các toán tử cùng nhau trong một truy vấn cập nhật duy nhất:

db.employee.updateOne(
    {
        "employee_id": 794875
    },
    {
        $inc: {
            department_id: 1
        },
        $set: {
            job: "Sales Manager"
        }
    }
);

Thao tác này sẽ cập nhật công việc trường cho Người quản lý bán hàng và tăng Department_id bởi 1.

2.2. Cập nhật nhiều trường của nhiều tài liệu

Ngoài ra, chúng tôi cũng có thể cập nhật nhiều trường của nhiều hơn một tài liệu trong MongoDB. Chúng tôi chỉ cần bao gồm tùy chọn multi:true để sửa đổi tất cả các tài liệu phù hợp với tiêu chí truy vấn bộ lọc:

db.employee.update(
    {
        "job": "Sales Representative"
    },
    {
        $inc: { 
            salary: 10000
        }, 
        $set: { 
            department_id: 5
        }
    },
    {
        multi: true 
    }
);

Ngoài ra, chúng tôi sẽ nhận được kết quả tương tự bằng cách sử dụng updateMany truy vấn:

db.employee.updateMany(
    {
        "job": "Sales Representative"
    },
    {
        $inc: {
            salary: 10000
        },
        $set: {
            department_id: 5
        }
    }
);

Trong truy vấn trên, chúng tôi đã sử dụng updateMany phương pháp cập nhật nhiều hơn 1 tài liệu của bộ sưu tập.

2.3. Sự cố thường gặp khi cập nhật nhiều trường

Cho đến nay, chúng tôi đã học cách cập nhật nhiều trường bằng cách sử dụng truy vấn cập nhật bằng cách cung cấp hai toán tử khác nhau hoặc sử dụng một toán tử duy nhất trên nhiều trường.

Bây giờ, nếu chúng tôi sử dụng một toán tử nhiều lần với các trường khác nhau trong một truy vấn, MongoDB sẽ chỉ cập nhật câu lệnh cuối cùng của truy vấn cập nhật và bỏ qua phần còn lại:

db.employee.updateMany(
    {
        "employee_id": 794875
    },
    {
        $set: {
            department_id: 3
        },
        $set: {
            job:"Sales Manager"
        }
    }
);

Truy vấn trên sẽ trả về kết quả tương tự như sau:

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

Trong trường hợp này, công việc duy nhất sẽ được cập nhật thành “Người quản lý bán hàng”. Department_id giá trị sẽ không được cập nhật lên 3.

3. Cập nhật trường bằng trình điều khiển Java

Cho đến nay, chúng ta đã thảo luận về các truy vấn MongoDB thô. Bây giờ chúng ta hãy thực hiện các thao tác tương tự bằng Java. Trình điều khiển Java MongoDB hỗ trợ hai lớp để đại diện cho một tài liệu MongoDB, com.mongodb.BasicDBObject org.bson.Document. Chúng tôi sẽ xem xét cả hai phương pháp để cập nhật các trường trong tài liệu.

Trước khi tiếp tục, trước tiên hãy kết nối với nhân viên bộ sưu tập bên trong baeldung DB:

MongoClient mongoClient = new MongoClient(new MongoClientURI("localhost", 27017);
MongoDatabase database = mongoClient.getDatabase("baeldung");
MongoCollection<Document> collection = database.getCollection("employee");

Ở đây chúng tôi đã giả định rằng MongoDB đang chạy cục bộ tại cổng mặc định là 27017.

3.1. Sử dụng DBObject

Để tạo tài liệu trong MongoDB, chúng tôi sẽ sử dụng com.mongodb. Giao diện DBObject và lớp triển khai của nó com.mongodb.BasicDBObject .

Việc triển khai DBObject dựa trên các cặp khóa-giá trị. BasicDBObject được kế thừa từ LinkedHashMap lớp nằm trong mục đích sử dụng gói.

Bây giờ hãy sử dụng com.mongodb.BasicDBObject để thực hiện thao tác cập nhật trên nhiều trường:

BasicDBObject searchQuery = new BasicDBObject("employee_id", 794875);
BasicDBObject updateFields = new BasicDBObject();
updateFields.append("department_id", 3);
updateFields.append("job", "Sales Manager");
BasicDBObject setQuery = new BasicDBObject();
setQuery.append("$set", updateFields);
UpdateResult updateResult = collection.updateMany(searchQuery, setQuery);

Ở đây, trước tiên, chúng tôi đã tạo một truy vấn bộ lọc trên cơ sở worker_id. Thao tác này sẽ trả về một tập hợp các tài liệu. Hơn nữa, chúng tôi đã cập nhật giá trị của Department_id công việc theo truy vấn đã đặt.

3.2. Sử dụng bson Tài liệu

Chúng tôi có thể thực hiện tất cả các hoạt động MongoDB bằng cách sử dụng bson tài liệu. Đối với điều đó, trước tiên, chúng tôi cần đối tượng thu thập và sau đó thực hiện thao tác cập nhật bằng cách sử dụng updateMany phương pháp với bộ lọc bộ các chức năng.

UpdateResult updateQueryResult = collection.updateMany(Filters.eq("employee_id", 794875),
Updates.combine(Updates.set("department_id", 3), Updates.set("job", "Sales Manager")));

Ở đây, chúng tôi đang chuyển một bộ lọc truy vấn tới updateMany phương pháp. eq lọc các kết quả phù hợp với worker_id với văn bản khớp chính xác '794875'. Sau đó, chúng tôi cập nhật Department_id công việc sử dụng bộ nhà điều hành.

4. Sử dụng Truy vấn Thay thế

Cách tiếp cận đơn giản để cập nhật nhiều trường của một tài liệu là thay thế nó bằng một tài liệu mới có các giá trị được cập nhật.

Ví dụ:nếu chúng tôi muốn thay thế một tài liệu bằng worker_id 794875, chúng tôi có thể thực hiện truy vấn sau:

db.employee.replaceOne(
    {
        "employee_id": 794875
    },
    {
        "employee_id": 794875,
        "employee_name": "David Smith",
        "job": "Sales Manager",
        "department_id": 3,
        "salary": 30000,
        "hire_date": NumberLong("1643969311817")
    }
);

Lệnh trên sẽ in một JSON xác nhận trong đầu ra:

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

Đây, worker_id trường được sử dụng để lọc tài liệu. Đối số thứ hai của truy vấn cập nhật biểu thị tài liệu mà từ đó tài liệu hiện có sẽ được thay thế.

Trong truy vấn trên, chúng tôi đang thực hiện ReplaceOne , do đó, nó sẽ chỉ thay thế một tài liệu duy nhất bằng bộ lọc đó. Ngoài ra, nếu chúng tôi muốn thay thế tất cả các tài liệu bằng truy vấn bộ lọc đó, thì chúng tôi sẽ cần sử dụng updateMany phương pháp.


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Ngăn chặn JavaScript NoSQL Injection trong MongoDB

  2. 5 cách để có được giây từ một ngày trong MongoDB

  3. Xuất Bộ sưu tập MongoDB sang Tệp JSON

  4. Mongodb:Thực hiện truy vấn Phạm vi ngày từ ObjectId trong trình bao mongo

  5. Cập nhật các tài liệu con lồng nhau trong MongoDB với arrayFilters