2010-09-19 45 views
11

Giả sử một thiết lập như thế này:MongoDB: cross-bộ sưu tập truy vấn

blogposts 
{ 
    title:"Example", 
    slug:"example-post" 
    tags: ["foo", "bar"] 
}, 
{ 
    title:"Example2", 
    slug:"example2" 
    tags: ["foo"] 
} 

news 
{ 
    headline: "Test" 
    slug: "test-news" 
    tags: ["bar"] 
} 

Tôi biết tôi có thể nhận được tất cả các bài đăng trên blog với một từ khóa cụ thể:

$cursor = $blogposts->find(array('tags' => 'bar')); 

nhưng là có cách nào để truy vấn nhiều bộ sưu tập cùng một lúc để có được tất cả các tài liệu với thẻ? Ví dụ. để hiển thị tất cả nội dung có thẻ 'thanh'.

Trả lời

13

Không có cách nào để truy vấn nhiều bộ sưu tập cùng một lúc.

Cách tiếp cận tốt nhất là lưu trữ tất cả tài liệu trong cùng một bộ sưu tập, nếu tài liệu là tất cả cùng loại chung. Trong ví dụ của bạn, cả bài đăng trên blog và mục tin tức là một loại 'nội dung'.

content 
{ 
    type: "blogpost", 
    title: "Example", 
    slug: "example-post" 
    tags: ["foo", "bar"] 
}, 
{ 
    type: "blogpost", 
    title: "Example2", 
    slug: "example2" 
    tags: ["foo"] 
}, 
{ 
    type: "news", 
    headline: "Test" 
    slug: "test-news" 
    tags: ["bar"] 
} 

Cách tiếp cận này tận dụng lợi thế của tính chất ít lược đồ hơn của MongoDB; mặc dù cả hai loại tài liệu có thể có các thuộc tính khác nhau, tất cả chúng đều có thể được lưu trữ trong cùng một bộ sưu tập. Điều này cho phép bạn truy vấn tất cả nội dung của bạn hoặc chỉ một số loại nội dung, tùy thuộc vào yêu cầu của bạn.

+0

+1 cho cái nhìn sâu sắc tuyệt vời. Sẽ có sự khác biệt về hiệu suất nếu tôi sử dụng nhiều bộ sưu tập trong một bộ sưu tập duy nhất đặc biệt là khi tôi lập kế hoạch lập chỉ mục hai cột bên trong bộ sưu tập của mình? – Legend

+0

@Legend: Cảm ơn! Bằng cách sử dụng nhiều bộ sưu tập, bạn sẽ không phải lập chỉ mục trường 'type', điều này sẽ giúp bạn tiết kiệm một số RAM. Nhưng xét về hiệu suất truy vấn, sự khác biệt sẽ không đáng kể nếu bạn đã xác định các chỉ mục phù hợp. –

0

Kể từ Mongodb 3.2, giờ đây bạn có thể sử dụng giai đoạn tra cứu $ trong một đường ống tổng hợp cho phép bạn "tham gia" với một bộ sưu tập khác.

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ùng một cơ sở dữ liệu để lọc trong tài liệu từ “gia nhập” bộ sưu tập cho chế biến. Giai đoạn tra cứu $ thực hiện một kết quả bình đẳng giữa một trường từ các tài liệu đầu vào với một trường từ các tài liệu của bộ sưu tập “đã tham gia” .

Source

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