2010-09-19 26 views
11

Suponiendo una configuración como esta:MongoDB: cruzada colección de consulta

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

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

Sé que puedo conseguir todas las entradas de blog con una etiqueta específica:

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

pero ¿hay alguna forma de consulta múltiples colecciones a la vez para obtener todos los documentos con la etiqueta? P.ej. para mostrar todo el contenido con la etiqueta 'bar'.

Respuesta

13

No hay forma de consultar varias colecciones a la vez.

El mejor enfoque sería almacenar todos los documentos en la misma colección, si los documentos son todos del mismo tipo general. En su ejemplo, tanto las publicaciones de blog como las noticias son un tipo de 'contenido'.

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

Este enfoque aprovecha la naturaleza de esquema de MongoDB; aunque ambos tipos de documento pueden tener diferentes propiedades, todos pueden almacenarse en la misma colección. Esto le permite consultar todo su contenido, o solo algunos tipos de contenido, según sus requisitos.

+0

+1 para la gran penetración. ¿Habrá una diferencia de rendimiento si utilizo varias colecciones en una sola colección, especialmente cuando planeo indexar dos columnas dentro de mi colección? – Legend

+0

@Legend: ¡Gracias! Al usar múltiples colecciones, no tendrá que indexar el campo 'type', que le ahorrará algo de RAM. Pero en términos de rendimiento de la consulta, las diferencias serán insignificantes si ha definido los índices correctos. –

0

Desde Mongodb 3.2 ahora es posible usar la etapa $ lookup dentro de una canalización de agregación que le permite "unirse" contra otra colección.

realiza una combinación externa izquierda a una colección unsharded en la misma base de datos para filtrar en los documentos de la “unido” colección para procesamiento. La etapa $ lookup hace una coincidencia de igualdad entre un campo de los documentos de entrada con un campo de los documentos de la colección "unida" .

Source

Cuestiones relacionadas