¿Cuál es el operador $ unwind en MongoDB?

Este es mi primer día con MongoDB, así que por favor ve tranquilo conmigo 🙂

No puedo entender el operador $unwind , tal vez porque el inglés no es mi lengua materna.

 db.article.aggregate( { $project : { author : 1 , title : 1 , tags : 1 }}, { $unwind : "$tags" } ); 

El operador del proyecto es algo que puedo entender, supongo (es como SELECT , ¿no?). Pero luego, $unwind (citing) devuelve un documento para cada miembro de la matriz desenrollada dentro de cada documento fuente .

¿Es esto como un JOIN ? En caso afirmativo, ¿cómo se puede comparar el resultado de $project (con los _id , author , title y tags ) con el conjunto de tags ?

NOTA : Tomé el ejemplo del sitio web de MongoDB, no conozco la estructura del conjunto de tags . Creo que es una simple variedad de nombres de tags.

Primero, bienvenido a MongoDB!

Lo que hay que recordar es que MongoDB emplea un enfoque “NoSQL” para el almacenamiento de datos, por lo que se pierden los pensamientos de selects, joins, etc. de tu mente. La forma en que almacena sus datos se presenta en forma de documentos y colecciones, lo que permite un medio dynamic para agregar y obtener datos de sus ubicaciones de almacenamiento.

Dicho esto, para entender el concepto detrás del parámetro $ unwind, primero debes entender qué es lo que está diciendo el caso de uso que estás 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 tags son en realidad una matriz de 3 elementos, en este caso son “divertidos”, “buenos” y “divertidos”.

Lo que $ unwind hace es permitirte pelar un documento para cada elemento y devolver ese documento resultante. Pensar en esto en un enfoque clásico, sería el equivalente de “para cada elemento del conjunto de tags, devolver un documento con solo 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 tags. 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 que he encontrado hasta ahora.