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'));

Но есть ли какой-либо способ запросить несколько коллекций одновременно, чтобы получить все документы с тегом? Например, чтобы показать все содержимое с тегом "панель".

 11
Author: Tim Fountain, 2010-09-19

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; хотя оба типа документов могут иметь разные свойства, все они могут храниться в одной коллекции. Это позволяет вам запрашивать все вашего контента или только некоторых типов контента, в зависимости от ваших требований.

 13
Author: Niels van der Rest, 2010-09-19 13:02:26

Начиная с Mongodb 3.2 теперь можно использовать этап поиска $ в конвейере агрегации, позволяющий вам "присоединиться" к другой коллекции.

Выполняет левое внешнее соединение с неразделенной коллекцией в том же база данных для фильтрации документов из "объединенной" коллекции для обработки. На этапе поиска $ выполняется сопоставление равенства между полем из входных документов с полем из документов "присоединенного" коллекция.

Источник

 0
Author: Darxtar, 2017-05-23 17:56:24