MongoDB: перекрестные запросы - PullRequest
11 голосов
/ 19 сентября 2010

Предполагая настройку, подобную этой:

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 ]

13 голосов
/ 19 сентября 2010

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

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

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

0 голосов
/ 23 мая 2017

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

выполняет левое внешнее объединение с неотмеченной коллекцией в том же база данных для фильтрации документов из «объединенной» коллекции для обработка. Этап $ lookup выполняет равенство между полями из входных документов с полем из документов «Объединенная» коллекция.

Источник

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...