MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

campos correspondentes internamente no mongodb


Se possível, sugiro que você defina a condição ao armazenar os dados para que possa fazer uma verificação rápida da verdade (isInStudentsList ). Seria super rápido fazer esse tipo de consulta.

Caso contrário, há uma maneira relativamente complexa de usar o pipeline da estrutura de agregação para fazer o que você deseja em uma única consulta:
db.students.aggregate( 
    {$project: 
        {studentId: 1, studentIdComp: "$students.id"}},  
    {$unwind: "$studentIdComp"}, 
    {$project : { studentId : 1, 
        isStudentEqual: { $eq : [ "$studentId", "$studentIdComp" ] }}}, 
    {$match: {isStudentEqual: true}})

Dado seu exemplo de entrada, a saída seria:
{
    "result" : [
         {
             "_id" : ObjectId("517b88decd483543a8bdd95b"),
             "studentId" : 23,
             "isStudentEqual" : true
         }
    ],
    "ok" : 1
}

Uma breve explicação dos passos:
  1. Crie uma projeção do documento com apenas studentId e um novo campo com um array contendo apenas o id (assim o primeiro documento conteria [23, 55] .
  2. Usando essa estrutura, $unwind . Isso cria um novo documento temporário para cada elemento da matriz no studentIdComp matriz.
  3. Agora, pegue esses documentos e crie uma nova projeção de documento, que continua com o studentId e adiciona um novo campo chamado isStudentEqual que compara a igualdade de dois campos, o studentId e studentIdComp . Lembre-se de que, neste momento, há um único documento temporário que contém esses dois campos.
  4. Por fim, verifique se o valor de comparação isStudentEqual for true e retornar esses documentos (que conterão o documento original _id e o studentId .
  5. Se o aluno estiver na lista várias vezes, talvez seja necessário agrupar os resultados em studentId ou _id para evitar duplicatas (mas não sei se você precisa disso).