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 cursorBướ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 fieldBước 3
If it does add the user to an array to be returnedCá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. comghi 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
Ở 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
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
Để 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
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
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 đó