En primer lugar, ¡bienvenido a MongoDB!
Lo que hay que recordar es que MongoDB emplea un enfoque "NoSQL" para el almacenamiento de datos, así que olvídese de los pensamientos de selecciones, uniones, etc. La forma en que almacena sus datos es en forma de documentos y colecciones, lo que permite un medio dinámico de agregar y obtener los datos de sus ubicaciones de almacenamiento.
Dicho esto, para comprender el concepto detrás del parámetro $ desenrollar, primero debe comprender qué dice el caso de uso que está tratando de citar. El documento de ejemplo de mongodb.org es el siguiente:
{
title : "this is my title" ,
author : "bob" ,
posted : new Date () ,
pageViews : 5 ,
tags : [ "fun" , "good" , "fun" ] ,
comments : [
{ author :"joe" , text : "this is cool" } ,
{ author :"sam" , text : "this is bad" }
],
other : { foo : 5 }
}
Observe cómo las etiquetas son en realidad una matriz de 3 elementos, en este caso, "divertido", "bueno" y "divertido".
Lo que hace $ desenrollar es permitirle despegar un documento para cada elemento y devolver ese documento resultante. Para pensar en esto en un enfoque clásico, sería el equivalente de "para cada elemento en la matriz de etiquetas, devolver un documento con sólo ese elemento".
Por lo tanto, el resultado de ejecutar lo siguiente:
db.article.aggregate(
{ $project : {
author : 1 ,
title : 1 ,
tags : 1
}},
{ $unwind : "$tags" }
);
devolvería los siguientes documentos:
{
"result" : [
{
"_id" : ObjectId("4e6e4ef557b77501a49233f6"),
"title" : "this is my title",
"author" : "bob",
"tags" : "fun"
},
{
"_id" : ObjectId("4e6e4ef557b77501a49233f6"),
"title" : "this is my title",
"author" : "bob",
"tags" : "good"
},
{
"_id" : ObjectId("4e6e4ef557b77501a49233f6"),
"title" : "this is my title",
"author" : "bob",
"tags" : "fun"
}
],
"OK" : 1
}
Tenga en cuenta que lo único que cambia en la matriz de resultados es lo que se devuelve en el valor de las etiquetas. Si necesita una referencia adicional sobre cómo funciona esto, he incluido un enlace aquí . Espero que esto ayude, y buena suerte con su incursión en uno de los mejores sistemas NoSQL con los que me he encontrado hasta ahora.
Según la documentación oficial de mongodb:
$ desenrollar Deconstruye un campo de matriz de los documentos de entrada para generar un documento para cada elemento. Cada documento de salida es el documento de entrada con el valor del campo de matriz reemplazado por el elemento.
Explicación mediante un ejemplo básico:
Un inventario de colección tiene los siguientes documentos:
Las siguientes operaciones de $ desenrollar son equivalentes y devuelven un documento para cada elemento en el campo de tamaños . Si el campo de tamaños no se resuelve en una matriz, pero no falta, es nulo o una matriz vacía, $ desenrollar trata el operando que no es una matriz como una matriz de un solo elemento.
o
Resultado de la consulta anterior:
¿Por qué es necesario?
$ relajarse es muy útil al realizar la agregación. divide el documento complejo / anidado en un documento simple antes de realizar varias operaciones como ordenar, buscar, etc.
Para saber más sobre $ relajarse:
https://docs.mongodb.com/manual/reference/operator/aggregation/unwind/
Para saber más sobre la agregación:
https://docs.mongodb.com/manual/reference/operator/aggregation-pipeline/
fuente
considere el siguiente ejemplo para comprender estos datos en una colección
Consulta - db.test1.aggregate ([{$ desenrollar: "$ tamaños"}]);
salida
fuente
Permítanme explicarles de una manera relacionada con RDBMS. Esta es la declaración:
para aplicar al documento / registro :
El proyecto $ / Seleccionar simplemente devuelve estos campos / columnas como
La siguiente es la parte divertida de Mongo, considere esta matriz
tags : [ "fun" , "good" , "fun" ]
como otra tabla relacionada (no puede ser una tabla de búsqueda / referencia porque los valores tienen alguna duplicación) llamada "etiquetas". Recuerde que SELECT generalmente produce cosas verticales, así que desenrollar las "etiquetas" es dividir () verticalmente en "etiquetas" de tabla.El resultado final de $ proyecto + $ desenrollar:
Traduzca la salida a JSON:
Debido a que no le dijimos a Mongo que omitiera el campo "_id", por lo que se agrega automáticamente.
fuente