0
I’m having trouble returning a "Join" on mongodb using lookup on subdocuments. I may have modeled it wrong, if you could give me a few pointers I’d be grateful! :)
I have the following collections:
Students
{
"_id" : ObjectId("59b825c41e1f430cd8439361"),
"atualizado_em" : ISODate("2017-09-20T01:21:51.900+0000"),
"criado_em" : ISODate("2017-09-12T18:22:04.766+0000"),
"nome" : "ADERLINDO SANTOS DA SILVA",
"provas" : [
{
"simulado" : ObjectId("59b83cca794ab45fb304d25c"),
"_id" : ObjectId("59c1c35c500c97715b56095a"),
"questoes" : [
{
"opcaoMarcada" : ObjectId("59b050e2794ab45fb304d110"),
"questao" : ObjectId("59b050e2794ab45fb304d10f"),
"_id" : ObjectId("59c1c35c500c97715b56095c"),
"flagcorreta" : false
},
{
"opcaoMarcada" : ObjectId("59b0511d794ab45fb304d119"),
"questao" : ObjectId("59b0511d794ab45fb304d115"),
"_id" : ObjectId("59c1c35c500c97715b56095b"),
"flagcorreta" : null
}
]
}
]
}
Questaos
{
"_id" : ObjectId("59a835e748395a5cf2d2e817"),
"enunciado" : "Enunciado da questão",
"tags" : [ 'tag1', 'tag2', 'tag3' ],
"opcoes" : [
{
"_id" : ObjectId("59a835e748395a5cf2d2e81c"),
"correta" : true,
"texto" : "Opção 1",
"marcacoes" : NumberInt(48)
},
{
"_id" : ObjectId("59a835e748395a5cf2d2e81b"),
"texto" : "Opção 2",
"marcacoes" : NumberInt(6)
},
{
"_id" : ObjectId("59a835e748395a5cf2d2e81a"),
"texto" : "Opção 3",
"marcacoes" : NumberInt(10)
}
]
"__v" : NumberInt(0),
"atualizado_em" : ISODate("2017-09-21T00:44:27.223+0000"),
"criado_em" : ISODate("2017-09-14T22:44:08.979+0000")
}
Result I need:
[
{
"_id" : ObjectId("59b825c41e1f430cd8439361"),
"atualizado_em" : ISODate("2017-09-20T01:21:51.900+0000"),
"criado_em" : ISODate("2017-09-12T18:22:04.766+0000"),
"nome" : "Fulano de Tal",
"provas" : [
{
"_id" : ObjectId("59c1c35c500c97715b56095a"),
"questoes" : [
{
"questao" : "ENUNCIADO DA QUESTÃO",
"opcaoMarcada" : "TEXTO COM A OPÇÃO MARCADA",
"flagcorreta" : false
},
{
"questao" : "ENUNCIADO DA QUESTÃO",
"opcaoMarcada" : "TEXTO COM A OPÇÃO MARCADA",
"flagcorreta" : false
}
]
}
]
}
]
I started with something like this, but now I have no idea how to recover the option that the student marked in the test.
db.alunos.aggregate([
{ $match: { 'provas': { $size: 1 } } },
{ $unwind:"$provas"},
{ $unwind:"$provas.questoes"},
{
$lookup:
{
from: "questaos",
localField: "provas.questoes.questao",
foreignField: "_id",
as: "questoesArray"
}
},
{ $unwind: "$questoesArray" },
{ $group: {
"_id": "$_id",
"nome": { "$first": "$nome" },
"questoes": { "$push": "$questoesArray.enunciado" }
}
},
{ $sort: { nome: 1 } }
])
The result was as follows:
{
"_id" : ObjectId("59b825c51e1f430cd8439705"),
"nome" : "ABIMAEL DE SOUSA ALVES",
"questoes" : [
"<p style=\"margin-left:0cm; margin-right:0cm\">Sabe-se que as novas tecnologias alteraram o quadro tradicional das principais mídias que serviam para apresentar conteúdos educacionais. Hoje, não dispomos apenas de mídias como o texto impresso, os sons das transmissões radiofônicas e as imagens do vídeo ou da televisão, pois podemos contar com os novos dispositivos eletrônicos, ou seja, com as mídias digitais. Por isso, as práticas de leitura e de escrita ganham novas possibilidades educacionais, podendo ser vivenciadas e veiculadas não apenas no espaço da escola, já que elas se virtualizam e são desterritorializadas, estendendo-se para ambientes virtuais e sendo exibidas em dispositivos como telefones celulares, <em>tablets</em> e <em>notebooks</em>, ao mesmo tempo em que convivem com os livros impressos e os cadernos.</p>\n\n<p style=\"margin-left:0cm; margin-right:0cm\"> </p>\n\n<p style=\"margin-left:0cm; margin-right:0cm\">A partir do que é afirmado acima, é possível concluir corretamente que:</p>",
"<p style=\"margin-left:36pt; margin-right:0cm\">As novas práticas de leitura e de escrita no hipertexto eletrônico, as mudanças de comportamento nas redes sociais, as novas formas de se relacionar nos ambientes virtuais, as transações comerciais eletrônicas e a economia no mundo digital são algumas das manifestações que ocorrem no ciberespaço e podem ser associadas, corretamente, com:</p>",
"<p style=\"margin-left:0cm; margin-right:0cm\">“A globalização é, de certa forma, o ápice do processo de internacionalização do mundo capitalista. [...] No fim do século XX e graças aos avanços da ciência, produziu-se um sistema de técnicas presidido pelas técnicas da informação, que passaram a exercer um papel de elo entre as demais, unindo-as e assegurando ao novo sistema técnico uma presença planetária. Só que a globalização não é apenas a existência desse novo sistema de técnicas. Ela é também o resultado das ações que asseguram a emergência de um mercado dito global, responsável pelo essencial dos processos políticos atualmente eficazes.” </p>\n\n<p style=\"margin-left:0cm; margin-right:0cm; text-align:right\">SANTOS, Milton. Por uma outra globalização: do pensamento único à consciência universal. </p>\n\n<p style=\"margin-left:0cm; margin-right:0cm; text-align:right\">Rio de Janeiro: Record, 2000, p. 23-24. </p>\n\n<p style=\"margin-left:0cm; margin-right:0cm; text-align:justify\"> </p>\n\n<p style=\"margin-left:0cm; margin-right:0cm; text-align:justify\">Considerando o enunciado anterior, sobre o processo de globalização na sociedade contemporânea, assinale a alternativa correta. </p>",
"<p style=\"margin-left:0cm; margin-right:0cm\">Um dos componentes vitais em um sistema operacional é a estrutura que armazena dados sobre os processos em execução, muitas vezes chamada Bloco de Controle de Processos (BCP). Essa estrutura é manipulada por todos os mecanismos de gerenciamento do SO, o que evidentemente cria problemas de condição de corrida nesse acesso.</p>\n\n<p style=\"margin-left:0cm; margin-right:0cm\">Considerando essas informações, assinale a alternativa que apresenta, corretamente, o tratamento do acesso ao BCP em um SO.</p>",
"<p style=\"margin-left:0cm; margin-right:0cm\">Apesar de a alocação de memória em blocos implicar em um mecanismo mais complexo para a conversão entre endereços virtuais e endereços físicos, é a partir do seu conceito que o gerenciamento de memória</p>\n\n<p style=\"margin-left:0cm; margin-right:0cm\">evoluiu para o que se tem hoje, com o uso de memória cache e memória virtual.</p>\n\n<p style=\"margin-left:0cm; margin-right:0cm\">Com base nessas informações, considere as afirmativas a seguir.</p>\n\n<p style=\"margin-left:0cm; margin-right:0cm\">I. O endereçamento é facilitado por hardware especializado.</p>\n\n<p style=\"margin-left:0cm; margin-right:0cm\">II. O uso de páginas de tamanho igual a potência de 2 permite um melhor gerenciamento.</p>\n\n<p style=\"margin-left:0cm; margin-right:0cm\">III. O uso de memória cache elimina a necessidade de endereçamento, pois trata as informações como linhas de cache.</p>\n\n<p style=\"margin-left:0cm; margin-right:0cm\">IV. Endereços virtuais não são necessários se não se usar memória virtual.</p>\n\n<p style=\"margin-left:0cm; margin-right:0cm\">Assinale a alternativa correta.</p>",
"<p style=\"margin-left:0px; margin-right:0px\">O VFS (<em>Virtual File System</em>) é o mecanismo que permite que chamadas de sistemas genéricas possam ser executadas independentemente do sistema de arquivos usado ou do meio físico. Em relação aos objetos primários do VFS, analise as afirmações abaixo e assinale V, se verdadeiras, ou F, se falsas.</p>\n\n<p style=\"margin-left:0px; margin-right:0px\">( ) Superbloco é utilizado para armazenar informações sobre um sistema de arquivos específico.</p>\n\n<p style=\"margin-left:0px; margin-right:0px\">( ) Inode representa um arquivo específico. Cada arquivo é representado por um inode no Sistema de Arquivos.</p>\n\n<p style=\"margin-left:0px; margin-right:0px\">( ) Dentry representa uma entrada de diretório. O objeto Dentry não corresponde a qualquer estrutura de dados armazenada em disco.</p>\n\n<p style=\"margin-left:0px; margin-right:0px\"> </p>\n\n<p style=\"margin-left:0px; margin-right:0px\">A ordem correta de preenchimento dos parênteses, de cima para baixo, é:</p>",
"<p>Sobre o IPSec, assinale a alternativa correta.</p>",
"<p style=\"margin-left:0cm; margin-right:0cm\">Em um sistema distribuído, a comunicação __________ entre os processos origem e destino ocorre quando um envio (<em>send</em>) é realizado. Neste caso, o processo origem é __________ até que a recepção (<em>receive</em>) correspondente seja realizada. A comunicação __________ ocorre quando a operação envio (<em>send</em>) é __________ e a transmissão da mensagem ocorre __________ com o processo origem.</p>\n\n<p style=\"margin-left:0cm; margin-right:0cm\">Assinale a alternativa que preenche, correta e respectivamente, as lacunas do trecho acima.</p>",
"<p>Em uma rede de computadores, cujos roteadores estão configurados para atualizar suas tabelas de roteamento por meio do emprego de protocolos de roteamento, é correto afirmar:</p>",
"<p style=\"margin-left:0cm; margin-right:0cm\">O mecanismo de RPC é bastante utilizado para a programação em sistemas distribuídos.</p>\n\n<p style=\"margin-left:0cm; margin-right:0cm\">Implementações mais eficientes desse mecanismo permitem a realização de RPC assíncrono, em que</p>"
]
}
Hello friend, thanks for the return! I have not tested yet because I am without access to the base due to the earthquake in Mexico :/ foreignField: "options. _id", and then made a map. I’m dying to understand, could you help me understand this part? I’m still getting the hang of mongodb’s pipeline, it’s still confusing for me. I appreciate the attention and the response! As soon as I can test I’ll come back here and validate as a response.
– Rafael Jourdan
I don’t know what language you are using, but it could make the result in the programming.. I just made a projectile so I could get the final result.
– jcardoso
@Rafaeljourdan managed to test .. the script
– jcardoso