Подтвердить что ты не робот

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".

4b9b3361

Ответ 1

Невозможно запросить сразу несколько коллекций.

Наилучшим подходом было бы хранить все документы в одной коллекции, если документы имеют одинаковый общий тип. В вашем примере как сообщения в блогах, так и новости являются типом "контента".

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

Ответ 2

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

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

Источник