Mongodb lấy dữ liệu từ nhiều bộ sưu tập

Tôi có 3 bộ sưu tập trong MongoDB không thể thay đổi lược đồ của chúng. Một số truy vấn cần truy cập 3 bộ sưu tập

Tôi biết rằng tôi cần nhiều truy vấn để thực hiện việc này nhưng tôi không chắc phương pháp hiệu quả nhất để thực hiện việc này là gì. Ví dụ sau đây được đơn giản hóa

Dữ liệu của tôi chứa bộ sưu tập "Người dùng" đóng vai trò là cha hợp lý cho hai bộ sưu tập còn lại. Hai bộ sưu tập còn lại là "DVD" và "CD". Một người dùng có thể có nhiều đĩa CD hoặc DVD

User Document 
id : "jim",
location : "sweden"

CD Document
name : "White Album",
owner : "jim"

DVD Document
name : "Fargo",
owner : "jim"

Bây giờ, cách tiếp cận tôi hiện đang thực hiện như sau. Nếu tôi muốn lấy lại tất cả đĩa CD và DVD cho người dùng ở Thụy Điển

Bước 1

Get all users in Sweden and return a cursor

Bước 2

Iterate through the each user in the cursor and perform a lookup on both the DVD and CD collections to see if the users id matches the owner field

Bước 3

If it does add the user to an array to be returned

Cách tiếp cận này yêu cầu 2 truy vấn bổ sung và dường như thực sự không hiệu quả đối với tôi. Có một cách hiệu quả hơn để làm điều này?

- stackoverflow. com

ghi bàn. 2

câu trả lời được chấp nhận

Bạn có thể thực hiện một số cải tiến về truy vấn như sau

  • Trong khi chọn người dùng, chỉ trả lại trường id

db. người sử dụng. tìm ({vị trí. "thụy điển"},{id. 1})

  • Tạo danh sách Chuỗi chứa tên người dùng và chuyển danh sách đó bằng truy vấn $in. Chạy truy vấn $in trên bộ sưu tập cd & dvd như sau
db.cd.find({owner : {$in : ["jim", "tom", ...]}})
db.dvd.find({owner : {$in : ["jim", "tom", ...]}})

Đồng thời thêm các chỉ mục trên các bộ sưu tập để cải thiện hiệu suất truy vấn

Đọc thêm

ghi bàn. 0

Nó không phải là không hiệu quả như nó có vẻ

Rất có thể bạn đang nghĩ đến các kỹ thuật SQL theo đó một tập hợp kết quả được tạo mỗi khi bạn truy vấn và đến lượt nó được lưu vào bộ đệm trên đĩa hoặc trong bộ nhớ

MongoDB phát trực tiếp từ các tệp dữ liệu mỗi lô con trỏ, điều đó có nghĩa là dữ liệu của nó "trực tiếp" từ cơ sở dữ liệu không giống như tập kết quả. Điều này cũng có nghĩa là việc ping truy vấn lẻ cũng tốn rất nhiều tài nguyên

Như bạn đã nói, một tùy chọn là đưa tất cả người dùng trở lại và mỗi lần lặp lại sẽ đánh giá xem chúng có nên được hiển thị hay không vì chúng có các bản ghi liên quan. Điều này có thể phân phối đồng đều các con trỏ ngừng quá tải, tuy nhiên, vẫn có khả năng quá tải con trỏ trên máy chủ

Một tùy chọn khác là lặp lại tất cả người dùng từ Thụy Điển và lấy lại mảng user_id khổng lồ để truy vấn bộ sưu tập CD và DVD. Từ đó, bạn sẽ khớp chúng trong ứng dụng của mình và quay lại khi cần

Tuy nhiên, chính xác cách bạn giải quyết vấn đề này tùy thuộc vào kịch bản của bạn và lượng dữ liệu bạn có

ghi bàn. 0

Nếu bạn không thể thay đổi lược đồ của mình và bạn muốn biết có bao nhiêu người dùng từ Thụy Điển có CD hoặc DVD, thì tôi nghĩ đây là phương pháp nhỏ nhất

  • user_ids * = Nhận tất cả user_id từ bộ sưu tập DVD và CD. Nhận tất cả người dùng có id trong *user_ids* và đến từ Thụy Điển

Sau đó, bạn chỉ có 2 truy vấn nhưng nếu bộ sưu tập DVD và CD của bạn đủ lớn thì có lẽ phương pháp này sẽ không nhanh hơn phương pháp của bạn, thậm chí phương pháp này chỉ sử dụng 2 truy vấn

Một bộ sưu tập trong MongoDB tương tự như một bảng trong RDBMS. Bộ sưu tập MongoDB không thực thi các lược đồ. Mỗi bộ sưu tập MongoDB có thể có nhiều tài liệu. Tài liệu tương đương với hàng trong bảng trong RDBMS

Để tạo một bộ sưu tập, hãy sử dụng lệnh db.createCollection(). Phần sau tạo một bộ sưu tập employees mới trong cơ sở dữ liệu hiện tại, là cơ sở dữ liệu humanResourceDB được tạo trong chương trước

Mongodb lấy dữ liệu từ nhiều bộ sưu tập
Tạo bộ sưu tập

Ở trên, bộ sưu tập employees được tạo bằng phương pháp

Get all users in Sweden and return a cursor
0. Nó trả về một đối tượng
Get all users in Sweden and return a cursor
1, cho biết bộ sưu tập đã được tạo thành công

Như đã đề cập ở trên, một cơ sở dữ liệu có thể có nhiều bộ sưu tập. Sau đây tạo ra nhiều bộ sưu tập

Mongodb lấy dữ liệu từ nhiều bộ sưu tập
Tạo nhiều bộ sưu tập

Sử dụng các lệnh

Get all users in Sweden and return a cursor
2 để liệt kê tất cả các bộ sưu tập trong cơ sở dữ liệu

Mongodb lấy dữ liệu từ nhiều bộ sưu tập
Hiển thị bộ sưu tập

Để xóa một bộ sưu tập, hãy sử dụng phương thức

Get all users in Sweden and return a cursor
3

Mongodb lấy dữ liệu từ nhiều bộ sưu tập
Xóa bộ sưu tập

Tạo bộ sưu tập trong MongoDB Compass

Để tạo bộ sưu tập mới bằng MongoDB Compass, hãy kết nối la bàn với máy chủ của bạn và chọn cơ sở dữ liệu

Nhấp vào nút "Tạo bộ sưu tập" để tạo bộ sưu tập mới, như hình bên dưới

Mongodb lấy dữ liệu từ nhiều bộ sưu tập
MongoDB Compass - Bộ sưu tập

Nhập tên của bộ sưu tập, đánh dấu vào hộp kiểm thích hợp và nhấp vào nút

Get all users in Sweden and return a cursor
4 để tạo bộ sưu tập đó

Làm cách nào để tìm nạp dữ liệu từ nhiều bộ sưu tập trong MongoDB?

Để thực hiện MongoDB Tham gia hai bộ sưu tập, bạn phải sử dụng toán tử tra cứu $ . Nó được định nghĩa là một 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à hỗ trợ lọc dữ liệu từ các tài liệu đã nối. Ví dụ: nếu người dùng yêu cầu tất cả các điểm từ tất cả học sinh, thì truy vấn bên dưới có thể được viết. Sinh viên.

Chúng tôi có thể truy vấn nhiều bộ sưu tập trong MongoDB không?

Bạn có thể truy vấn nhiều bộ sưu tập bằng cách sử dụng tổng hợp $lookup . Tôi đã viết một ví dụ ở đây trên diễn đàn. Ngoài ra, Nguồn dữ liệu kết quả truy vấn hoàn toàn có thể kết hợp kết quả từ một số truy vấn MongoDB. Không quan trọng bạn đã sử dụng cơ sở dữ liệu nguồn nào.

Làm cách nào để kết hợp dữ liệu từ nhiều bộ sưu tập thành một bộ sưu tập?

Trong MongoDB, chúng ta có thể kết hợp dữ liệu của nhiều bộ sưu tập thành một thông qua giai đoạn tổng hợp $lookup. Trong phần này, bạn phải chỉ định bộ sưu tập nào bạn muốn kết hợp với bộ sưu tập hiện tại và chọn trường khớp với cả hai bộ sưu tập

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

Mongoose - truy vấn để lấy dữ liệu từ nhiều bộ sưu tập .
người sử dụng. js var mongoose = require('mongoose'); . Lược đồ; . .
bình luận. js var mongoose = require('mongoose'); . Lược đồ; . .
bưu kiện. js var mongoose = require('mongoose');