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'));
Но есть ли какой-либо способ запросить несколько коллекций одновременно, чтобы получить все документы с тегом? Например, чтобы показать все содержимое с тегом "панель".
2 answers
Невозможно запросить несколько коллекций одновременно.
Наилучшим подходом было бы хранить все документы в одной коллекции, если все документы относятся к одному и тому же общему типу. В вашем примере и сообщения в блоге, и новости являются разновидностью "контента".
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; хотя оба типа документов могут иметь разные свойства, все они могут храниться в одной коллекции. Это позволяет вам запрашивать все вашего контента или только некоторых типов контента, в зависимости от ваших требований.
Начиная с Mongodb 3.2 теперь можно использовать этап поиска $ в конвейере агрегации, позволяющий вам "присоединиться" к другой коллекции.
Выполняет левое внешнее соединение с неразделенной коллекцией в том же база данных для фильтрации документов из "объединенной" коллекции для обработки. На этапе поиска $ выполняется сопоставление равенства между полем из входных документов с полем из документов "присоединенного" коллекция.