Mongodb so sánh hai trường trong cùng một tài liệu

MongoDB là 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ế và 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, v.v.

Trong hướng dẫn này, chúng ta sẽ học cách sửa đổi nhiều trường của tài liệu bằng truy vấn cập nhật và thay thế. Đố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à triển khai tương ứng của truy vấ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 cơ sở dữ liệu mới, baeldung và bộ sưu tập mẫu, employee. 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 số tài liệu vào bộ sưu tập này bằng cách sử dụng truy vấn insertMany

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 ta sẽ nhận được một JSON với ObjectId cho cả hai tài liệu như hình 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

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

Chúng ta có thể sử dụng toán tử $set và $inc để cập nhật bất kỳ trường nào trong MongoDB. Toán tử $set sẽ đặt giá trị mới được chỉ định trong khi toán tử $inc sẽ tăng giá trị theo một giá trị đã 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 toán tử $set

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

Trong truy vấn trên, trường employee_id và employee_name được sử dụng để lọc tài liệu và toán tử $set được sử dụng để cập nhật trường job và department_id

Chúng ta cũng có thể sử dụng các toán tử $set và $inc 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 trường công việc thành Quản lý bán hàng và tăng department_id lên 1

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

Ngoài ra chúng ta cũng có thể cập nhật nhiều trường của nhiều tài liệu trong MongoDB. Chúng ta chỉ cần thê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 truy vấn updateMany

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 phương thức updateMany để 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 giờ, chúng ta đã 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 ta 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ư truy vấn này

________số 8

Trong trường hợp này, công việc duy nhất sẽ được cập nhật thành "Quản lý bán hàng". Giá trị department_id sẽ không được cập nhật thành 3

3. Cập nhật các 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ờ 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 để biểu diễn một tài liệu MongoDB, com. mongodb. BasicDBObject và tổ chức. bson. Tài liệu. Chúng ta 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 bộ sưu tập nhân viên bên trong baeldung DB

MongoClient mongoClient = new MongoClient(new MongoClientURI("localhost", 27017);
MongoDatabase database = mongoClient.getDatabase("baeldung");
MongoCollection 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 ta sẽ sử dụng lệnh 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ừ lớp LinkedHashMap trong gói util

Bây giờ chúng ta 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

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")
    }
]);
0

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

3. 2. Sử dụng tài liệu bson

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

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")
    }
]);
1

Ở đây, chúng tôi đang chuyển bộ lọc truy vấn tới phương thức updateMany. Bộ lọc eq đối sánh employee_id với văn bản đối sánh chính xác '794875'. Sau đó, chúng tôi cập nhật bộ phận_id và công việc bằng cách sử dụng toán tử thiết lập

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

Cách tiếp cận ngây thơ để cập nhật nhiều trường của 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 employee_id 794875, chúng tôi có thể thực hiện truy vấn sau

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")
    }
]);
2

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

________số 8

Ở đây, trường employee_id đượ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à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 phương thức updateMany

5. Phần kết luận

Trong bài viết này, chúng tôi đã khám phá nhiều cách khác nhau để cập nhật nhiều trường của tài liệu trong MongoDB. Chúng tôi đã thảo luận rộng rãi về hai cách triển khai, sử dụng MongoDB shell và sử dụng trình điều khiển Java

Có nhiều tùy chọn khác nhau để cập nhật nhiều trường của tài liệu bao gồm các toán tử $inc và $set 

Làm cách nào để so sánh hai trường của cùng một tài liệu trong MongoDB?

MongoDB so sánh hai trường trong cùng một tài liệu . Khi chúng tôi có một điều kiện nhất định mà chúng tôi phải so sánh nhiều thuộc tính trên cùng một trường. Hãy để chúng tôi hiểu với sự giúp đỡ của một ví dụ. use the $where operator to compare the fields. When we have a given condition where we have to compare multiple properties on the same field. Let us understand with the help of an example.

Làm cách nào để so sánh hai bộ sưu tập MongoDB?

Cách so sánh các bộ sưu tập MongoDB .
So sánh các bộ sưu tập MongoDB nằm trong các cơ sở dữ liệu và/hoặc máy chủ khác nhau
Phân tích sự khác biệt giữa các tài liệu và trường của họ
Đồng bộ hóa dữ liệu của bạn khi cần và
Xuất kết quả so sánh sang tệp Word hoặc CSV

$EQ trong MongoDB là gì?

Chỉ định điều kiện bình đẳng . Toán tử $eq khớp với các tài liệu trong đó giá trị của một trường bằng với giá trị đã chỉ định. Chỉ định toán tử $eq tương đương với việc sử dụng biểu mẫu { trường.

Làm cách nào để sử dụng elemMatch trong MongoDB?

Toán tử $elemMatch so khớp các tài liệu chứa trường mảng với ít nhất một phần tử khớp với tất cả các tiêu chí truy vấn đã chỉ định . Nếu bạn chỉ xác định một điều kiện