¿Cómo realizo el equivalente de SQL Join en MongoDB?
Por ejemplo, digamos que tiene dos colecciones (usuarios y comentarios) y quiero extraer todos los comentarios con pid = 444 junto con la información del usuario para cada uno.
comments
{ uid:12345, pid:444, comment="blah" }
{ uid:12345, pid:888, comment="asdf" }
{ uid:99999, pid:444, comment="qwer" }
users
{ uid:12345, name:"john" }
{ uid:99999, name:"mia" }
¿Hay alguna manera de extraer todos los comentarios con un determinado campo (por ejemplo, ... find ({pid: 444})) y la información del usuario asociada con cada comentario de una vez?
En este momento, primero recibo los comentarios que coinciden con mis criterios, luego descifro todos los uid en ese conjunto de resultados, obtengo los objetos del usuario y los combino con los resultados del comentario. Parece que lo estoy haciendo mal.
Respuestas:
A partir de Mongo 3.2, las respuestas a esta pregunta ya no son correctas. El nuevo operador de búsqueda $ agregado a la canalización de agregación es esencialmente idéntico a una unión externa izquierda:
https://docs.mongodb.org/master/reference/operator/aggregation/lookup/#pipe._S_lookup
De los documentos:
Por supuesto, Mongo no es una base de datos relacional, y los desarrolladores están teniendo cuidado de recomendar casos de uso específicos para $ lookup, pero al menos a partir de 3.2 ahora es posible hacer uniones con MongoDB.
fuente
Esta página en el sitio oficial de mongodb aborda exactamente esta pregunta:
https://mongodb-documentation.readthedocs.io/en/latest/ecosystem/tutorial/model-data-for-ruby-on-rails.html
fuente
Podemos fusionar / unir todos los datos dentro de una sola colección con una función fácil en pocas líneas utilizando la consola del cliente mongodb, y ahora podríamos realizar la consulta deseada. Debajo de un ejemplo completo,
.- Autores:
.- Categorías:
.- Libros
.- Préstamo de libros
.- La magia:
.- Obtenga los nuevos datos de recopilación:
.- Respuesta :)
Espero que estas líneas te puedan ayudar.
fuente
Tienes que hacerlo de la manera que describiste. MongoDB es una base de datos no relacional y no admite combinaciones.
fuente
Como otros han señalado, está tratando de crear una base de datos relacional a partir de ninguna base de datos relacional que realmente no desea hacer, pero de todos modos, si tiene un caso en el que tiene que hacer esto, aquí hay una solución que puede usar. Primero hacemos una búsqueda foreach en la colección A (o en su caso, los usuarios) y luego obtenemos cada elemento como un objeto, luego usamos la propiedad del objeto (en su caso uid) para buscar en nuestra segunda colección (en los comentarios de su caso) si podemos encontrarlo, entonces tenemos una coincidencia y podemos imprimir o hacer algo con ella. Espero que esto te ayude y buena suerte :)
fuente
Con la combinación correcta de $ lookup , $ project y $ match , puede unir varias tablas en múltiples parámetros. Esto se debe a que se pueden encadenar varias veces.
Supongamos que queremos hacer lo siguiente ( referencia )
Paso 1: enlace todas las tablas
puede $ buscar tantas tablas como desee.
$ lookup : uno para cada tabla en la consulta
$ unwind - porque los datos están desnormalizados correctamente, de lo contrario están envueltos en matrices
Código de Python.
Paso 2: definir todos los condicionales
$ proyecto : defina todas las declaraciones condicionales aquí, además de todas las variables que desea seleccionar.
Código Python ..
Paso 3: une todos los condicionales
$ match : une todas las condiciones con OR o AND, etc. Puede haber varios de estos.
$ proyecto : indefinir todos los condicionales
Código Python ..
Casi cualquier combinación de tablas, condicionales y combinaciones se puede hacer de esta manera.
fuente
Aquí hay un ejemplo de una colección "unirse" * Actores y películas :
https://github.com/mongodb/cookbook/blob/master/content/patterns/pivot.txt
Hace uso de
.mapReduce()
método* join : una alternativa para unirse en bases de datos orientadas a documentos
fuente
Puedes unir dos colecciones en Mongo usando la búsqueda que se ofrece en la versión 3.2. En su caso, la consulta sería
o también puede unirse con respecto a los usuarios, entonces habrá un pequeño cambio como se indica a continuación.
Funcionará igual que la unión izquierda y derecha en SQL.
fuente
Depende de lo que intentes hacer.
Actualmente lo tiene configurado como una base de datos normalizada, lo cual está bien, y la forma en que lo hace es apropiado.
Sin embargo, hay otras formas de hacerlo.
Podría tener una colección de publicaciones que haya incrustado comentarios para cada publicación con referencias a los usuarios que puede consultar de forma iterativa para obtener. Puede almacenar el nombre del usuario con los comentarios, puede almacenarlos todos en un documento.
Lo que ocurre con NoSQL es que está diseñado para esquemas flexibles y lectura y escritura muy rápidas. En una granja típica de Big Data, la base de datos es el mayor cuello de botella, tiene menos motores de base de datos que los servidores de aplicaciones y front-end ... son más caros pero más potentes, también el espacio en el disco duro es muy barato en comparación. La normalización proviene del concepto de tratar de ahorrar espacio, pero tiene un costo para hacer que sus bases de datos realicen uniones complicadas y verifiquen la integridad de las relaciones, realizando operaciones en cascada. Todo lo cual ahorra a los desarrolladores algunos dolores de cabeza si diseñaron la base de datos correctamente.
Con NoSQL, si acepta que la redundancia y el espacio de almacenamiento no son problemas debido a su costo (tanto en el tiempo de procesador requerido para realizar actualizaciones como en los costos del disco duro para almacenar datos adicionales), la desnormalización no es un problema (para los arreglos integrados que se convierten cientos de miles de elementos puede ser un problema de rendimiento, pero la mayoría de las veces no es un problema). Además, tendrá varias aplicaciones y servidores front-end para cada grupo de bases de datos. Pídales que hagan el trabajo pesado de las uniones y que los servidores de bases de datos se dediquen a leer y escribir.
TL; DR: Lo que estás haciendo está bien, y hay otras formas de hacerlo. Consulte los patrones del modelo de datos de la documentación de mongodb para obtener algunos ejemplos excelentes. http://docs.mongodb.org/manual/data-modeling/
fuente
Hay una especificación que admite muchos controladores que se llama DBRef.
Tomado de la documentación de MongoDB: Modelos de datos> Referencia del modelo de datos> Referencias de bases de datos
fuente
$ búsqueda (agregación)
Realiza una unión externa izquierda a una colección no sombreada en la misma base de datos para filtrar documentos de la colección "unida" para su procesamiento. Para cada documento de entrada, la etapa de búsqueda $ agrega un nuevo campo de matriz cuyos elementos son los documentos coincidentes de la colección "unida". La etapa de búsqueda $ pasa estos documentos reformados a la siguiente etapa. La etapa de búsqueda $ tiene las siguientes sintaxis:
Igualdad
Para realizar una coincidencia de igualdad entre un campo de los documentos de entrada con un campo de los documentos de la colección "unida", la etapa de búsqueda $ tiene la siguiente sintaxis:
La operación correspondería a la siguiente instrucción pseudo-SQL:
URL de Mongo
fuente
Antes de 3.2.6 , Mongodb no admite consultas de combinación como mysql. debajo de la solución que funciona para usted.
fuente
Puede ejecutar consultas SQL, incluida la unión en MongoDB con mongo_fdw desde Postgres.
fuente
MongoDB no permite combinaciones, pero puede usar complementos para manejar eso. Verifique el complemento mongo-join. Es lo mejor y ya lo he usado. Puede instalarlo usando npm directamente como este
npm install mongo-join
. Puede consultar la documentación completa con ejemplos .(++) herramienta realmente útil cuando necesitamos unir colecciones (N)
(-) podemos aplicar condiciones solo en el nivel superior de la consulta
Ejemplo
fuente
Puede hacerlo utilizando la canalización de agregación, pero es difícil escribirlo usted mismo.
Puede usar
mongo-join-query
para crear la canalización de agregación automáticamente a partir de su consulta.Así es como se vería su consulta:
Su resultado tendría el objeto de usuario en el
uid
campo y puede vincular tantos niveles como desee. Puede completar la referencia al usuario, que hace referencia a un Equipo, que hace referencia a otra cosa, etc.Descargo de responsabilidad : escribí
mongo-join-query
para abordar este problema exacto.fuente
playORM puede hacerlo por usted usando S-SQL (SQL escalable) que simplemente agrega particiones de modo que pueda hacer uniones dentro de particiones.
fuente
No, no parece que lo estés haciendo mal. Las uniones de MongoDB son "del lado del cliente". Más o menos como dijiste:
No es una unión "real", pero en realidad es mucho más útil que una unión SQL porque no tiene que lidiar con filas duplicadas para "muchas" uniones laterales, en lugar de decorar el conjunto originalmente seleccionado.
Hay muchas tonterías y FUD en esta página. Resulta que 5 años después, MongoDB sigue siendo una cosa.
fuente
Creo que si necesita tablas de datos normalizadas, debe probar otras soluciones de bases de datos.
Pero he encontrado esa solución para MOngo en Git. Por cierto, en código de inserción: tiene el nombre de la película, pero no la identificación de la película .
Problema
Tienes una colección de actores con una variedad de películas que han hecho.
Desea generar una colección de películas con una variedad de actores en cada una.
Algunos datos de muestra
Solución
Necesitamos recorrer cada película en el documento del actor y emitir cada película individualmente.
La captura aquí está en la fase de reducción. No podemos emitir una matriz desde la fase de reducción, por lo que debemos construir una matriz de actores dentro del documento de "valor" que se devuelve.
El códigoObserve cómo actor_list es en realidad un objeto javascript que contiene una matriz. Observe también que el mapa emite la misma estructura.
Ejecute lo siguiente para ejecutar el mapa / reducir, envíelo a la colección "pivote" e imprima el resultado:
printjson (db.actors.mapReduce (map, reduce, "pivot")); db.pivot.find (). forEach (printjson);
Aquí está la salida de muestra, tenga en cuenta que "Pretty Woman" y "Runaway Bride" tienen "Richard Gere" y "Julia Roberts".
fuente
Podemos fusionar dos colecciones utilizando la subconsulta mongoDB. Aquí hay un ejemplo, Comentarios--
Usuarios--
Subconsulta de MongoDB para JOIN--
Obtenga el resultado de la Colección recién generada
Resultado--
Espero que esto ayude.
fuente