假设有这样的设置:
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'的所有内容。
答案 0 :(得分: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的无模式特性;虽然两种文档类型可能具有不同的属性,但它们都可以存储在同一个集合中。这允许您查询所有内容,或仅查询某些类型的内容,具体取决于您的要求。
答案 1 :(得分:0)
从Mongodb 3.2开始,现在可以在聚合管道中使用$ lookup阶段,允许您“加入”另一个集合。
对同一个中的非整数集合执行左外连接 数据库从“已加入”集合中过滤文档 处理。 $ lookup阶段在字段之间进行相等匹配 从输入文件中提取一个字段的文件 “加入”系列。