2016-02-08 20 views
7

Với giai đoạn đường ống tổng hợp mới $lookup chúng tôi hiện có thể thực hiện 'các kết nối bên ngoài bên trái'.

Thoạt nhìn, tôi muốn thay thế ngay một trong các bộ sưu tập không chuẩn hóa của chúng tôi bằng hai bộ sưu tập riêng biệt và sử dụng $lookup để tham gia khi truy vấn. Điều này sẽ giải quyết vấn đề có, khi cần thiết, để cập nhật một số lượng lớn tài liệu. Bây giờ chúng tôi có thể cập nhật chỉ một tài liệu.

Nhưng chắc chắn điều này quá tốt là đúng? Đây là một NoSQL, cơ sở dữ liệu tài liệu sau khi tất cả!

MongoDB của CTO cũng highlights his concerns:

Chúng tôi vẫn lo ngại rằng $ tra cứu có thể bị lạm dụng để điều trị MongoDB giống như một cơ sở dữ liệu quan hệ. Nhưng thay vì hạn chế tính khả dụng, chúng tôi sẽ giúp nhà phát triển biết khi nào việc sử dụng của nó là thích hợp và khi đó là mô hình chống giả mạo. Trong những tháng tới, chúng tôi sẽ vượt ra ngoài tài liệu hiện có để cung cấp hướng dẫn rõ ràng, mạnh mẽ trong lĩnh vực này.

Các giới hạn của $lookup là gì? Tôi có thể sử dụng chúng trong thời gian thực, truy vấn hoạt động dữ liệu của chúng tôi hay chúng được để lại để báo cáo, các tình huống ngoại tuyến không?

Trả lời

4

Tôi chia sẻ cùng một sự nhiệt tình của bạn cho $lookup.

Tôi nghĩ rằng có sự cân bằng. Một trong những mối quan tâm chính của cơ sở dữ liệu SQL (và đó là một trong những lý do cho nguồn gốc của NoSQL) là ở quy mô lớn, sự tham gia có thể mất rất nhiều thời gian (tốt, tương đối nói). Nếu bạn bắt đầu lập mô hình toàn bộ cơ sở dữ liệu NoSQL của mình như thể nó là một cơ sở dữ liệu về các hàng và bảng (chỉ cần sử dụng ref s), thì bạn bắt đầu mô hình hóa nó như thể nó đơn giản là một cơ sở dữ liệu SQL (đến một mức độ). Ngay cả MongoDB cũng đã đề cập đến nó (giống như bạn đưa vào câu hỏi của bạn):

Chúng tôi vẫn lo ngại rằng việc tra cứu $ có thể bị lạm dụng để coi MongoDB như một cơ sở dữ liệu quan hệ.

Bạn nói:

này sẽ giải quyết vấn đề gặp phải, khi cần thiết, để cập nhật một số lượng lớn các tài liệu. Bây giờ chúng tôi có thể cập nhật chỉ một tài liệu.

Tôi không chắc chắn bộ sưu tập của bạn trông như thế nào, nhưng chắc chắn có vẻ như đó có thể là sử dụng tốt cho $lookup.

Tôi có thể sử dụng chúng trong thời gian thực, hoạt động truy vấn

Tôi xin nói, một lần nữa, nó phụ thuộc vào việc sử dụng hợp cụ thể của bạn.Bạn sẽ phải so sánh:

  • ngữ nghĩa mong muốn của các truy vấn của bạn (declarative vs bắt buộc)
  • Cho dù mô hình hóa dữ liệu của bạn như quan hệ hơn (và do đó sử dụng $lookup) trong một số trường hợp là giá trị tiềm năng thương mại-off trong thời gian tính toán (đó là giả định rằng truy vấn trên các bộ sưu tập thậm chí còn điều gì đó để được quan tâm, nói tính toán)

vv ...

tôi chắc chắn rằng trong những tháng tới chúng ta sẽ thấy tes perf ts của "tham gia bên ngoài bên trái" và có lẽ MongoDB sẽ bắt đầu viết một số bài viết về thời điểm $lookup là một mẫu giả.

Hy vọng câu trả lời này sẽ giúp thêm vào cuộc thảo luận.

4

Trước hết MongoDB là cơ sở dữ liệu dựa trên tài liệu và sẽ luôn như vậy. Vì vậy, các $lookup hợp đường ống giai đoạn mới trong phiên bản 3.2 không thay đổi MongoDB đến cơ sở dữ liệu quan hệ (RDBMS) như CTO MongoDB của đề cập:

Chúng tôi vẫn lo ngại rằng $ tra cứu có thể bị lạm dụng để điều trị MongoDB như một cơ sở dữ liệu quan hệ .

Hạn chế đầu tiên của $lookup như đã đề cập trong tài liệu là nó:

Thực hiện một trái bên ngoài tham gia vào một bộ sưu tập unsharded trong cơ sở dữ liệu tương tự để lọc trong tài liệu từ “gia nhập” bộ sưu tập cho Chế biến.

Điều đó có nghĩa là bạn không thể sử dụng nó với bộ sưu tập đã phân loại.

Ngoài ra các nhà điều hành $lookup không làm việc trực tiếp với một mảng như đã đề cập trong post do đó bạn sẽ cần một $unwind giai đoạn sơ bộ để denormalize localField nếu nó là một mảng.

Bây giờ bạn nói:

này sẽ giải quyết vấn đề gặp phải, khi cần thiết, để cập nhật một số lượng lớn các tài liệu.

Đây là ý tưởng hay nếu dữ liệu của bạn được cập nhật thường xuyên hơn khi được đọc. như đã đề cập trong 6 Rules of Thumb for MongoDB Schema Design: Part 3, đặc biệt nếu bạn có bộ dữ liệu phân cấp lớn.

Việc không chuẩn hóa một hoặc nhiều trường có ý nghĩa nếu các trường đó được đọc thường xuyên hơn các trường được cập nhật.

Tôi tin rằng với cẩn thận schema design có thể bạn sẽ không cần toán tử $lookup.

Các vấn đề liên quan