MongoDB:跨集合查询

11

假设设置如下:

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”的内容。

2个回答

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的无模式特性;虽然两种文档类型可能具有不同的属性,但它们都可以存储在同一个集合中。这使您可以查询所有内容或仅查询某些类型的内容,具体取决于您的要求。


对于这个很棒的见解点赞。如果我计划在我的集合中索引两列,那么使用多个集合而不是单个集合会有性能差异吗? - Legend
@Legend:谢谢!通过使用多个集合,您不必索引“type”字段,这将节省一些RAM。但是,如果您定义了正确的索引,则在查询性能方面的差异将是微不足道的。 - Niels van der Rest

0

自Mongodb 3.2版本开始,现在可以在聚合管道中使用$lookup阶段,使您能够对另一个集合进行“连接”。

执行左外部连接以过滤来自“连接”集合的文档进行处理。 $lookup阶段在输入文档的字段与“连接”文档的字段之间执行相等匹配。

来源


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接