Mongodb cách liên kết các bộ sưu tập

Chúng tôi đang lướt qua các mẫu chống mẫu thiết kế lược đồ MongoDB. Cho đến giờ trong loạt bài này, chúng ta đã thảo luận về bốn trong số sáu phản mẫu

Bình thường hóa dữ liệu và chia nhỏ dữ liệu thành các phần khác nhau để tối ưu hóa không gian và giảm trùng lặp dữ liệu có thể giống như bản chất thứ hai đối với những người có nền tảng cơ sở dữ liệu quan hệ. Tuy nhiên, việc tách dữ liệu thường được truy cập cùng nhau thực sự là một phản mẫu trong MongoDB. Trong bài đăng này, chúng ta sẽ tìm hiểu lý do tại sao và thảo luận về những việc bạn nên làm để thay thế

Nếu bạn thích học qua video (hoặc bạn chỉ thích nghe tôi lặp lại, "Dữ liệu được truy cập cùng nhau nên được lưu trữ cùng nhau"), hãy xem video ở trên

Tách dữ liệu được truy cập cùng nhau

Giống như bạn sẽ sử dụng một join để kết hợp thông tin từ các bảng khác nhau trong cơ sở dữ liệu quan hệ, MongoDB có một thao tác cho phép bạn kết hợp thông tin từ nhiều bảng. $lookup rất phù hợp cho các hoạt động không thường xuyên, hiếm khi được sử dụng hoặc các truy vấn phân tích có thể chạy qua đêm mà không bị giới hạn thời gian. Tuy nhiên, $lookup không tuyệt lắm khi bạn thường xuyên sử dụng nó trong các ứng dụng của mình. Tại sao?

Các hoạt động $lookup chậm và tốn nhiều tài nguyên so với các hoạt động không cần kết hợp dữ liệu từ nhiều bộ sưu tập

Quy tắc ngón tay cái khi lập mô hình dữ liệu của bạn trong MongoDB là

Dữ liệu được truy cập cùng nhau nên được lưu trữ cùng nhau

Thay vì phân tách dữ liệu thường được sử dụng cùng nhau giữa nhiều bộ sưu tập, hãy tận dụng tính năng nhúng và mảng để giữ dữ liệu cùng nhau trong một bộ sưu tập duy nhất

Ví dụ: khi lập mô hình một tệp , bạn có thể nhúng tài liệu từ một bộ sưu tập dưới dạng tài liệu phụ vào tài liệu từ một bộ sưu tập khác. Khi lập mô hình một , bạn có thể nhúng thông tin từ nhiều tài liệu trong một bộ sưu tập dưới dạng một mảng tài liệu trong một bộ sưu tập khác

Nếu việc kết hợp dữ liệu từ các bộ sưu tập riêng biệt thành một bộ sưu tập duy nhất sẽ dẫn đến các mảng lớn, không có giới hạn hoặc tài liệu cồng kềnh, bạn có thể muốn giữ các bộ sưu tập riêng biệt và sao chép một số dữ liệu được sử dụng thường xuyên cùng nhau trong cả hai bộ sưu tập. Bạn có thể sử dụng Mẫu tập hợp con để sao chép một tập hợp con các tài liệu từ một bộ sưu tập này sang một bộ sưu tập khác. Bạn cũng có thể sử dụng Mẫu tham chiếu mở rộng để sao chép một phần dữ liệu trong mỗi tài liệu từ bộ sưu tập này sang bộ sưu tập khác. Trong cả hai mẫu, bạn có tùy chọn tạo tham chiếu giữa các tài liệu trong cả hai bộ sưu tập. Hãy nhớ rằng bất cứ khi nào bạn cần kết hợp thông tin từ cả hai bộ sưu tập, bạn có thể sẽ cần sử dụng $lookup. Ngoài ra, bất cứ khi nào bạn sao chép dữ liệu, bạn chịu trách nhiệm đảm bảo dữ liệu được sao chép luôn đồng bộ

Như chúng tôi đã nói trong suốt loạt bài này, mỗi trường hợp sử dụng là khác nhau. Khi bạn lập mô hình lược đồ của mình, hãy xem xét cẩn thận cách bạn sẽ truy vấn dữ liệu và dữ liệu bạn sẽ lưu trữ sẽ trông như thế nào trên thực tế

Một bài đăng Anti-Pattern sẽ ra sao nếu không có ví dụ từ Công viên và Giải trí? . Vì vậy, hãy trở lại với Leslie

Leslie quyết định tổ chức một Liên Hợp Quốc kiểu mẫu cho học sinh trung học địa phương và tuyển một số đồng nghiệp của cô ấy cũng tham gia. Mỗi người tham gia sẽ đóng vai trò là đại biểu cho một quốc gia trong sự kiện. Cô chỉ định Andy và Donna làm đại biểu cho Phần Lan

Leslie quyết định lưu trữ thông tin liên quan đến Model United Nations trong cơ sở dữ liệu MongoDB. Cô ấy muốn lưu trữ thông tin sau trong cơ sở dữ liệu của mình

  • Số liệu thống kê cơ bản về mỗi quốc gia

  • Danh sách các tài nguyên mà mỗi quốc gia có sẵn để giao dịch

  • Danh sách đại biểu của mỗi quốc gia

  • Tuyên bố chính sách cho mỗi quốc gia

  • Thông tin về từng sự kiện Model United Nations mà cô ấy điều hành

Với thông tin này, cô ấy muốn có thể nhanh chóng tạo các báo cáo sau

  • Báo cáo quốc gia bao gồm các số liệu thống kê cơ bản, tài nguyên hiện có để giao dịch, danh sách đại biểu, tên và ngày của năm tài liệu chính sách gần đây nhất và danh sách tất cả các sự kiện Mô hình Liên hợp quốc mà quốc gia này đã tham gia

  • Một báo cáo sự kiện có chứa thông tin về sự kiện và tên của các quốc gia đã tham gia

Sự kiện Model United Nations bắt đầu và Andy rất hào hứng tham gia. Anh ta quyết định không muốn bất kỳ nguồn tài nguyên "nhàm chán" nào của đất nước mình, vì vậy anh ta bắt đầu giao dịch với các quốc gia khác để có được tất cả những con sư tử trên thế giới

Mongodb cách liên kết các bộ sưu tập

Leslie quyết định tạo các bộ sưu tập cho từng loại thông tin mà cô ấy cần lưu trữ trong cơ sở dữ liệu của mình. Sau khi Andy giao dịch xong, Leslie có tài liệu như sau

Khi Leslie muốn tạo một báo cáo về Phần Lan, cô ấy phải sử dụng $lookup để kết hợp thông tin từ cả năm bộ sưu tập. Cô ấy muốn tối ưu hóa hiệu suất cơ sở dữ liệu của mình, vì vậy, cô ấy quyết định tận dụng tính năng nhúng để kết hợp thông tin từ năm bộ sưu tập của mình thành một bộ sưu tập duy nhất

Leslie bắt đầu làm việc để cải thiện sơ đồ của cô ấy dần dần. Khi cô ấy nhìn vào lược đồ của mình, cô ấy nhận ra rằng cô ấy có mối quan hệ một đối một giữa các tài liệu trong bộ sưu tập Countries của mình và bộ sưu tập Resources của cô ấy. Cô ấy quyết định nhúng thông tin từ bộ sưu tập Resources dưới dạng tài liệu phụ vào các tài liệu trong bộ sưu tập Countries của mình

Bây giờ tài liệu cho Phần Lan trông giống như sau

Như bạn có thể thấy ở trên, cô ấy đã giữ thông tin về các tài nguyên cùng nhau dưới dạng tài liệu phụ trong tài liệu của mình cho Phần Lan. Đây là một cách dễ dàng để sắp xếp dữ liệu

Cô ấy không cần bộ sưu tập Resources của mình nữa, vì vậy cô ấy xóa nó đi

Tại thời điểm này, cô ấy có thể truy xuất thông tin về một quốc gia và tài nguyên của quốc gia đó mà không cần phải sử dụng $lookup

Leslie tiếp tục phân tích lược đồ của mình. Cô ấy nhận ra rằng cô ấy có mối quan hệ một-nhiều giữa các quốc gia và đại biểu, vì vậy cô ấy quyết định tạo một mảng có tên $lookup2 trong tài liệu Countries của mình. Mỗi mảng $lookup2 sẽ lưu trữ các đối tượng có thông tin đại biểu. Bây giờ tài liệu của cô ấy cho Phần Lan trông giống như sau

Leslie cảm thấy tự tin về việc lưu trữ thông tin đại biểu trong tài liệu quốc gia của mình vì mỗi quốc gia sẽ chỉ có một số ít đại biểu (có nghĩa là mảng của cô ấy sẽ không phát triển vô hạn) và cô ấy sẽ không thường xuyên truy cập thông tin về các đại biểu riêng biệt từ các quốc gia liên kết của họ

Leslie không còn cần bộ sưu tập $lookup5 của mình nữa, vì vậy cô ấy đã xóa nó

Leslie tiếp tục tối ưu hóa lược đồ của mình và bắt đầu xem bộ sưu tập $lookup6 của mình. Cô ấy có mối quan hệ một-nhiều giữa các quốc gia và chính sách. Cô ấy cần đưa tiêu đề và ngày của năm tài liệu chính sách gần đây nhất của mỗi quốc gia vào báo cáo của mình. Cô ấy cân nhắc nhúng tài liệu chính sách vào tài liệu quốc gia của mình, nhưng tài liệu có thể nhanh chóng trở nên khá lớn tùy theo độ dài của chính sách. Cô ấy không muốn rơi vào cái bẫy của Anti-Pattern Tài liệu cồng kềnh, nhưng cô ấy cũng muốn tránh sử dụng $lookup mỗi khi chạy báo cáo

Leslie quyết định tận dụng Mẫu tập hợp con. Cô ấy lưu tên và ngày của năm tài liệu chính sách gần đây nhất trong tài liệu quốc gia của mình. Cô ấy cũng tạo một tham chiếu đến tài liệu chính sách, vì vậy cô ấy có thể dễ dàng thu thập tất cả thông tin cho từng chính sách khi cần. Cô ấy để nguyên bộ sưu tập $lookup6 của mình. Cô ấy biết rằng cô ấy sẽ phải duy trì một số thông tin trùng lặp giữa các tài liệu trong bộ sưu tập Countries và bộ sưu tập $lookup6, nhưng cô ấy quyết định sao chép một ít thông tin là một sự đánh đổi tốt để đảm bảo truy vấn nhanh.

Tài liệu của cô ấy cho Phần Lan bây giờ giống như sau

Leslie tiếp tục kiểm tra truy vấn của cô ấy cho báo cáo của cô ấy về từng quốc gia. $lookup cuối cùng cô ấy đã kết hợp thông tin từ bộ sưu tập Countries và bộ sưu tập $lookup3. Cô ấy có mối quan hệ nhiều-nhiều giữa các quốc gia và sự kiện. Cô ấy cần có khả năng tạo báo cáo tổng thể về từng sự kiện một cách nhanh chóng, vì vậy cô ấy muốn giữ bộ sưu tập $lookup3 riêng biệt. Cô ấy quyết định sử dụng Mẫu tham chiếu mở rộng để giải quyết tình trạng khó xử của mình. Cô ấy bao gồm thông tin cô ấy cần về từng sự kiện trong tài liệu quốc gia của mình và duy trì tham chiếu đến tài liệu sự kiện hoàn chỉnh để cô ấy có thể nhận thêm thông tin khi cần. Cô ấy sẽ sao chép ngày sự kiện và chủ đề sự kiện trong cả hai bộ sưu tập Countries$lookup3, nhưng cô ấy cảm thấy thoải mái với điều này vì dữ liệu đó rất khó thay đổi

Sau tất cả các cập nhật của cô ấy, tài liệu của cô ấy cho Phần Lan bây giờ giống như sau

Dữ liệu được truy cập cùng nhau nên được lưu trữ cùng nhau. Nếu bạn sẽ thường xuyên đọc hoặc cập nhật thông tin cùng nhau, hãy cân nhắc việc lưu trữ thông tin cùng nhau bằng cách sử dụng các tài liệu hoặc mảng lồng nhau. Xem xét cẩn thận trường hợp sử dụng của bạn và cân nhắc những lợi ích và hạn chế của việc sao chép dữ liệu khi bạn tập hợp dữ liệu lại với nhau

Hãy chú ý đến một bài đăng về mẫu chống mẫu thiết kế lược đồ MongoDB cuối cùng

Khi bạn đã sẵn sàng xây dựng lược đồ trong MongoDB, hãy xem MongoDB Atlas, cơ sở dữ liệu dưới dạng dịch vụ được quản lý hoàn toàn của MongoDB. Atlas là cách dễ nhất để bắt đầu với MongoDB và có một cấp độ hào phóng, miễn phí mãi mãi

Chúng tôi có thể liên kết hai bộ sưu tập trong MongoDB không?

Có, bạn có thể tham gia 2 bộ sưu tập với Khung tổng hợp và giai đoạn $unionWith . Dưới đây là các tài liệu với cú pháp và ví dụ, vì vậy bạn có thể kiểm tra cách thực hiện.

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?

Trong MongoDB, phương thức copyTo() được sử dụng để sao chép tất cả tài liệu từ một bộ sưu tập (Bộ sưu tập nguồn) sang bộ sưu tập khác (Bộ sưu tập đích .

Làm cách nào để kết nối bảng này với bảng khác trong MongoDB?

1 – Kết nối với cơ sở dữ liệu SQL. .
2 – Xác định kết nối MongoDB đích. .
3 – Thêm bảng SQL. .
4 – Ánh xạ SQL sang MongoDB. .
5 – Xác định mối quan hệ một đối một. .
6 – Dọn dẹp bộ sưu tập MongoDB. .
7 – Chạy di chuyển SQL sang MongoDB. .
8 – Kiểm tra kỹ bộ sưu tập MongoDB

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

Để lấy dữ liệu từ một bộ sưu tập với Mongoose trong NodeJS, bạn phải có hai thứ cần thiết. .
Lược đồ. Nó là một cấu trúc tài liệu chứa thuộc tính với các loại của nó (giá trị mặc định, xác thực, v.v. .
Mô hình. Nó là một lớp được tạo với sự trợ giúp của Schema đã xác định và tài liệu MongoDB là một thể hiện của Model