2010-09-19 89 views
11

假设这样的设置:的MongoDB:跨收集查询

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

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

我知道我能得到所有具有特定标签的博客文章:

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

,但有什么办法来查询为了获得带有标签的所有文档,一次多个集合?例如。以标签'bar'显示所有内容。

回答

13

无法一次查询多个集合。

如果文档都是相同的一般类型,最好的方法是将所有文档存储在同一个集合中。在你的例子中,博客文章和新闻都是一种'内容'。

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"] 
} 

该方法充分利用了MongoDB的无模式特性;尽管这两种文档类型可能具有不同的属性,但它们都可以存储在同一个集合中。这使您可以查询您的所有内容,或根据您的要求查询某些类型的内容。

+0

+1了很大的启示。如果我在一个集合中使用多个集合,特别是在计划对集合中的两列进行索引计划时,会有性能差异吗? – Legend 2010-10-02 18:15:19

+0

@传奇:谢谢!通过使用多个集合,您不必索引'type'字段,这将为您节省一些RAM。但是在查询性能方面,如果您已经定义了正确的索引,则差异可以忽略不计。 – 2010-10-02 19:19:33

0

由于Mongodb 3.2现在有可能在聚合管道中使用$ lookup阶段,允许您对另一个集合进行“连接”。

执行左外连接到unsharded集合中的相同 数据库中的文档,以过滤从用于 处理“接合”集合。 $ lookup阶段在来自输入文档的字段 与来自 “已加入”集合的文档的字段之间进行相等匹配。

Source