Làm cách nào để liên kết hai bộ sưu tập trong mongodb?

Cách tìm nạp dữ liệu từ các bộ sưu tập khác nhau thông qua hoạt động tập hợp MongoDB— (Giải thích bằng ví dụ)

Một vài ngày trước, tôi đã nói chuyện với một số bạn bè và đồng nghiệp là nhà phát triển của mình và tôi thấy rằng hầu hết chúng ta đã hiểu sai về các giai đoạn tổng hợp và toán tử trong MongoDB. Vì vậy, tôi đã nghĩ đến việc chia sẻ kiến ​​thức và kiến ​​thức của mình về chủ đề này vì tôi thực sự cảm thấy rằng để mở rộng quy mô hệ thống và tăng hiệu suất của các ứng dụng, tối ưu hóa truy vấn cơ sở dữ liệu là một phần không thể thiếu

Trong bài viết này, chúng ta sẽ tìm hiểu về một số kỹ thuật tổng hợp quan trọng và được sử dụng nhiều nhất trong MongoDB. Bạn có thể đánh dấu bài viết này và nó có thể rất hữu ích bất cứ khi nào bạn cần hỗ trợ

Ok, đủ rồi, bắt đầu nào

Tập hợp trong MongoDB là gì?

Tập hợp — như nghĩa đen cho thấy nó liên quan đến việc kết hợp nhiều thứ khác nhau, tương tự như vậy trong MongoDb tập hợp là một kỹ thuật để truy vấn dữ liệu từ nhiều tập hợp bằng cách nhóm hoặc nối chúng, sau đó thực hiện nhiều thao tác khác nhau (được giải thích sau trong tài liệu này) rồi trả về kết quả được tính toán

Hãy lấy một ví dụ về truy vấn tìm kiếm,

Collection.find(query, projection);
// query - query for filtering out the data
// projection - Specifies the fields to return in the documents that match the query filter

Bây giờ hãy kiểm tra định dạng của một truy vấn tổng hợp,

Collection.aggregate(pipeline, options)
// pipeline -
A sequence of data aggregation operations or stages.
// options -
An optional configuration applicable for multiple operations in pipeline and it's used to optimize or setting rules for executing the query, it doesn't do any data processing

Vì vậy, bạn có thể thấy truy vấn tổng hợp nâng cao hơn nhiều so với truy vấn tìm và cũng có thể thực hiện các thao tác thao tác dữ liệu trên dữ liệu đã lọc, không giống như truy vấn tìm trong đó một truy vấn bị giới hạn chỉ truy xuất dữ liệu

Giai đoạn đường ống tổng hợp

Trong mọi truy vấn tổng hợp, đường dẫn đã nêu xuất hiện dưới dạng một mảng, trong đó tất cả các hoạt động được đặt tuần tự. Chúng được gọi là Giai đoạn đường ống tổng hợp, trong bài viết này, chúng tôi sẽ đề cập đến những giai đoạn đó là giai đoạn

Tùy chọn truy vấn tổng hợp khác nhau

Chúng ta sẽ thảo luận về tất cả các toán tử khác nhau có sẵn trong truy vấn tổng hợp. Dưới đây là sơ đồ của cơ sở dữ liệu đơn giản mà chúng tôi sẽ thực hiện tất cả các truy vấn,

Bộ sưu tập và Cấu trúc dữ liệu mà chúng tôi sẽ sử dụng cho tất cả các ví dụ

$match

Hoạt động này là để đọc dữ liệu từ một bộ sưu tập dựa trên một biểu thức phù hợp tương tự như truy vấn find(). Sự khác biệt duy nhất là ở đây quá trình lọc diễn ra thông qua biểu thức truy vấn $expr ( {$expr. {$eq. [‘_id’, ‘123' ] } } ) thay vì biểu thức thô ( { _id. ‘123’ } ) như trong phương thức tìm

Vì vậy, để lấy bản ghi của người dùng có id 123 từ bộ sưu tập Người dùng, bên dưới sẽ là truy vấn tổng hợp,

User.aggregate([{ $match: {$expr: {$eq: [‘ID’, ‘123' ] } }]);

$eq là toán tử khớp ở đây, khớp với ID. Tương tự, chúng ta có thể sử dụng $ne để chọn các tài liệu có giá trị của các khóa không giống với giá trị đã chỉ định

tra cứu $

Tra cứu là giai đoạn thực hiện nối ngoài bên trái với một bộ sưu tập khác và lọc dữ liệu từ các tài liệu đã nối

Vì vậy, trong trường hợp của chúng tôi, nếu chúng tôi muốn nhận tất cả các đơn đặt hàng có tên người dùng, thì chúng tôi có thể sử dụng truy vấn bên dưới,

Orders.aggregate([{ 
$lookup: {
from: 'User',
localField: 'User_ID',
foreignField: 'ID',
as: 'Customer'
}}]);

Bây giờ trong truy vấn này, tham số đầu tiên 'từ' chỉ định bộ sưu tập sẽ được kết hợp với bộ sưu tập hiện tại, sau đó 'localField' chỉ định khóa hiện có trong bộ sưu tập hiện tại sẽ khớp với khóa ngoại trong bộ sưu tập khác thông qua . Tại đây, User_ID từ Đơn đặt hàng và ID từ Người dùng được khớp và tham gia để lấy dữ liệu. Cuối cùng, 'as' được sử dụng làm bí danh cho dữ liệu

Một điểm cần lưu ý ở đây là, trong mỗi bản ghi đầu ra từ tra cứu, dữ liệu từ bảng đã tham gia được đưa vào bên trong một mảng dưới dạng phần tử đầu tiên, mỗi một hàng từ dữ liệu đầu ra của truy vấn trên sẽ trông như thế nào,

{ ID: String, Quantity: Number, User_ID: String, Customer: Array, Item_ID: String, Ordered_On: Date }

Ở đây trong mảng Khách hàng, phần tử đầu tiên sẽ là dữ liệu chúng ta đã nối

đường ống

Để tham gia các bộ sưu tập với các điều kiện cụ thể yêu cầu biểu thức, chúng tôi sử dụng đường dẫn cùng với $lookup

Vì vậy, nếu chúng tôi muốn nhận được tất cả người dùng với đơn đặt hàng của họ có số lượng lớn hơn 5,

User.aggregate([{ 
$lookup: {
from: 'Orders',
let: {ID: '$ID'},
pipeline: [{$match: {
$expr: {
$eq: [
'$User_ID', '$$ID'
],
$gt: [
'$quantity', 5
]
}}}]
as: 'OrdersData'
}}]);

Vì vậy, bằng cách sử dụng đường ống bên trong $lookup, chúng ta có thể dễ dàng tham gia các bảng theo bất kỳ điều kiện nào

thư giãn $

Yêu thích cá nhân của tôi, toán tử $unwind làm phẳng bất kỳ mảng nào và đính kèm mảng đó vào tài liệu đầu ra. Vì vậy, truy vấn bên dưới ( giống như truy vấn chúng tôi đã sử dụng trong $lookup ),

Orders.aggregate([{ 
$lookup: {
from: 'User',
localField: 'User_ID',
foreignField: 'ID',
as: 'Customer'
}},
{
$unwind: '$Customer'
}
]);

sẽ cho kết quả

{ ID: String, Quantity: Number, User_ID: String, Customer: Object, Item_ID: String, Ordered_On: Date }

Sự khác biệt cơ bản ở đây là $unwind chuyển đổi mảng chứa một phần tử thành một đối tượng phẳng là chính phần tử đó, có cùng tên

________số 8

$addFields

Bây giờ nhiều người sẽ nghĩ điều gì sẽ xảy ra nếu tôi chỉ muốn Khách hàng. Đặt tên nhưng ở cấp gốc của tài liệu để chúng tôi có thể truy cập nó như bên dưới,

output_data.Customer_Name

Rất tiếc, $unwind không thể làm điều này. /

Có siêu anh hùng được gọi là $addFields, bằng cách sử dụng giai đoạn cụ thể này, chúng ta có thể gán bất kỳ dữ liệu nào từ bên trong một đối tượng/mảng cho cấp gốc của tài liệu

Vì vậy, để có được Tên khách hàng như đã đề cập ở trên, chúng ta có thể viết một cái gì đó như -

Collection.aggregate(pipeline, options)
// pipeline -
A sequence of data aggregation operations or stages.
// options -
An optional configuration applicable for multiple operations in pipeline and it's used to optimize or setting rules for executing the query, it doesn't do any data processing
0

dự án $

Dự án về cơ bản là một giai đoạn lọc trong các truy vấn tổng hợp, nó cho biết các trường nào sẽ được lưu trong tài liệu cuối cùng

Để đưa ra một ví dụ, trong ví dụ trước, chúng ta đã thấy cách chúng ta có thể lấy một Customer_Name phẳng bên ngoài đối tượng Khách hàng trong bộ dữ liệu kết quả, tuy nhiên, thuộc tính Khách hàng vẫn sẽ ở đó

Vì chúng tôi đã có Customer_Name, đối tượng Customer không còn cần thiết nữa, vì vậy chúng tôi phải xóa nó và chúng tôi sẽ chỉ giữ lại Tên khách hàng, Số lượng đặt hàng và Item_ID trong đầu ra. Chúng ta có thể làm điều đó bằng cách sử dụng $project,

Collection.aggregate(pipeline, options)
// pipeline -
A sequence of data aggregation operations or stages.
// options -
An optional configuration applicable for multiple operations in pipeline and it's used to optimize or setting rules for executing the query, it doesn't do any data processing
1

Bây giờ truy vấn trên sẽ cho chúng ta kết quả như thế nào,

Collection.aggregate(pipeline, options)
// pipeline -
A sequence of data aggregation operations or stages.
// options -
An optional configuration applicable for multiple operations in pipeline and it's used to optimize or setting rules for executing the query, it doesn't do any data processing
2

Tham gia hơn 2 Bộ sưu tập bằng MongoDB Aggregation

Bây giờ có Item_ID trong dữ liệu đầu ra, dữ liệu này không thể đọc được và nếu đó là tên của Mục, thì việc nhận biết dữ liệu đó sẽ dễ dàng hơn nhiều. Hãy làm điều đó,

Collection.aggregate(pipeline, options)
// pipeline -
A sequence of data aggregation operations or stages.
// options -
An optional configuration applicable for multiple operations in pipeline and it's used to optimize or setting rules for executing the query, it doesn't do any data processing
3

Dưới đây là bảng cheat MongoDB Aggregation có thể rất hữu ích

Được rồi, chúng ta đã học được một số thao tác và giai đoạn quan trọng nhất đối với Tập hợp MongoDB, vui lòng đặt bất kỳ câu hỏi nào trong phần nhận xét, tôi sẽ rất sẵn lòng trả lời những câu hỏi đó.

Làm cách nào để lấy dữ liệu từ bộ sưu tập này sang bộ sưu tập khác trong MongoDB?

tạo các đối tượng mongodb để kết nối với cơ sở dữ liệu
khởi tạo các đối tượng số lượng lớn. Ghi chú. Tôi cũng đã tạo một bản sao lưu của các đối tượng số lượng lớn. Điều này sẽ giúp tôi khôi phục việc chèn hoặc xóa khi xảy ra lỗi. ví dụ. .
Lấy bản ghi nguồn phù hợp với tiêu chí lọc. source_find_results = source_db_obj. tìm (bộ lọc)

Tôi có thể sử dụng nhiều bộ sưu tập bên trong cơ sở dữ liệu trong MongoDB không?

Bạn có thể cập nhật tài liệu trong hai bộ sưu tập . Và thao tác có thể được thực hiện nguyên tử bằng Giao dịch MongoDB. Tuy nhiên, thao tác cập nhật trên mỗi bộ sưu tập sẽ riêng biệt - không thể thực hiện dưới dạng “truy vấn đơn lẻ”.

MongoDB có hỗ trợ mối quan hệ giữa các bộ sưu tập không?

Trong MongoDB, mối quan hệ thể hiện cách các loại tài liệu khác nhau có liên quan logic với nhau . Các mối quan hệ như một-một, một-nhiều, v.v. , có thể được biểu diễn bằng cách sử dụng hai mô hình khác nhau. Mô hình tài liệu nhúng. Mô hình tham chiếu.

Làm cách nào để tham gia nhiều bộ sưu tập trong cầy mangut?

Sử dụng giai đoạn tổng hợp $lookup để nối hai bộ sưu tập . Sử dụng toán tử đường ống để nối hai tập hợp dựa trên điều kiện đã chỉ định.