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:
- Crie uma projeção do documento com apenas
studentId
e um novo campo com um array contendo apenas oid
(assim o primeiro documento conteria[23, 55]
. - Usando essa estrutura, $unwind
. Isso cria um novo documento temporário para cada elemento da matriz no
studentIdComp
matriz. - Agora, pegue esses documentos e crie uma nova projeção de documento, que continua com o
studentId
e adiciona um novo campo chamadoisStudentEqual
que compara a igualdade de dois campos, ostudentId
estudentIdComp
. Lembre-se de que, neste momento, há um único documento temporário que contém esses dois campos. - Por fim, verifique se o valor de comparação
isStudentEqual
for true e retornar esses documentos (que conterão o documento original_id
e ostudentId
. - 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).