Предполагая такую установку:
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».
Невозможно сразу запросить несколько коллекций.
Наилучшим подходом было бы хранить все документы в одной коллекции, если документы имеют одинаковый общий тип. В вашем примере как сообщения в блогах, так и новости являются типом «контента».
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, теперь можно использовать этап $ lookup в конвейере агрегации, позволяющий «присоединиться» к другой коллекции.
выполняет левое внешнее соединение с незащищенной коллекцией в той же базе данных для фильтрации в документах из «объединенной» коллекции для обработки. Этап $ lookup выполняет совпадение равенства между полем из входных документов с полем из документов «объединенной» коллекции.
Источник