Em primeiro lugar, bem-vindo ao MongoDB!
A coisa a lembrar é que o MongoDB emprega uma abordagem "NoSQL" para armazenamento de dados, então elimine os pensamentos de seleções, junções, etc. de sua mente. A forma como ele armazena seus dados é na forma de documentos e coleções, o que permite um meio dinâmico de adicionar e obter os dados de seus locais de armazenamento.
Dito isso, para entender o conceito por trás do parâmetro $ unwind, primeiro você deve entender o que o caso de uso que você está tentando citar está dizendo. O documento de exemplo de mongodb.org é o seguinte:
{
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 como as tags são na verdade um array de 3 itens, neste caso sendo "divertido", "bom" e "divertido".
O que $ unfind faz é permitir que você retire um documento para cada elemento e retorne o documento resultante. Pensando nisso em uma abordagem clássica, seria o equivalente a "para cada item na matriz de tags, retorne um documento com apenas aquele item".
Assim, o resultado da execução do seguinte:
db.article.aggregate(
{ $project : {
author : 1 ,
title : 1 ,
tags : 1
}},
{ $unwind : "$tags" }
);
retornaria os seguintes 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
}
Observe que a única coisa que muda na matriz de resultado é o que está sendo retornado no valor das tags. Se você precisar de uma referência adicional sobre como isso funciona, incluí um link aqui . Espero que isso ajude e boa sorte com sua incursão em um dos melhores sistemas NoSQL que encontrei até agora.
De acordo com a documentação oficial do mongodb:
$ unfind Desconstrói um campo de array dos documentos de entrada para gerar um documento para cada elemento. Cada documento de saída é o documento de entrada com o valor do campo da matriz substituído pelo elemento.
Explicação por meio de exemplo básico:
Um inventário de coleção contém os seguintes documentos:
As seguintes operações $ unfind são equivalentes e retornam um documento para cada elemento no campo tamanhos . Se o campo de tamanhos não resolver para uma matriz, mas não estiver ausente, nulo ou uma matriz vazia, $ unfind tratará o operando não-matriz como uma matriz de elemento único.
ou
Acima da saída da consulta:
Por que é necessário?
$ unfind é muito útil ao realizar agregação ele quebra o documento complexo / aninhado em um documento simples antes de realizar várias operações, como classificação, pesquisa, etc.
Para saber mais sobre $ unfind:
https://docs.mongodb.com/manual/reference/operator/aggregation/unwind/
Para saber mais sobre agregação:
https://docs.mongodb.com/manual/reference/operator/aggregation-pipeline/
fonte
considere o exemplo abaixo para entender esses dados em uma coleção
Consulta - db.test1.aggregate ([{$ unfind: "$ tamanhos"}]);
resultado
fonte
Deixe-me explicar de uma forma correlacionada com a forma RDBMS. Esta é a declaração:
para aplicar ao documento / registro :
O $ project / Select simplesmente retorna esses campos / colunas como
A próxima é a parte divertida do Mongo, considere este array
tags : [ "fun" , "good" , "fun" ]
como outra tabela relacionada (não pode ser uma tabela de consulta / referência porque os valores têm alguma duplicação) chamada "tags". Lembre-se de que SELECT geralmente produz coisas verticais, então desenrolar as "tags" é dividir () verticalmente em "tags" de tabela.O resultado final de $ project + $ unfind:
Traduza a saída para JSON:
Porque não dissemos ao Mongo para omitir o campo "_id", então ele é adicionado automaticamente.
fonte