19 de set de 2010 13:59 do Tim Fountain

MongoDB: consultas de coleta cruzada

Supondo uma configuração como esta:

blogposts
{
  title:"Example",
  slug:"example-post"
  tags: ["foo", "bar"]
},
{
  title:"Example2",
  slug:"example2"
  tags: ["foo"]
}

news
{
  headline: "Test"
  slug: "test-news"
  tags: ["bar"]
}

Sei que posso obter todas as postagens do blog com uma tag específica:

$cursor = $blogposts->find(array('tags' => 'bar'));

mas existe alguma maneira de consultar várias coleções ao mesmo tempo para obter todos os documentos com a tag? Por exemplo. para mostrar todo o conteúdo com a tag 'bar'.

questionAnswers (0)

19 de set de 2010 13:02 do Niels van der Rest

A melhor abordagem seria armazenar todos os documentos na mesma coleção, se os documentos forem do mesmo tipo geral. No seu exemplo, as postagens do blog e os itens de notícias são um tipo de 'conteúdo'.

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"]
}

Essa abordagem tira proveito da natureza sem esquema do MongoDB; embora ambos os tipos de documento possam ter propriedades diferentes, todos eles podem ser armazenados na mesma coleção. Isso permite que você consulte todo o seu conteúdo ou apenas alguns tipos de conteúdo, dependendo dos requisitos.

23 de mai de 2017 17:56 do Darxtar

agora é possível usar o estágio de pesquisa $ dentro de um pipeline de agregação, permitindo que você "se junte" a outra coleção.

executa uma associação externa esquerda a uma coleção não compartilhada no mesmo banco de dados para filtrar documentos da coleção "unida" para processamento. O estágio de pesquisa $ faz uma correspondência de igualdade entre um campo dos documentos de entrada e um campo dos documentos da coleção "unida".

Fonte

yourAnswerToTheQuestion