Si es posible, le sugiero que establezca la condición mientras almacena los datos para que pueda realizar una verificación rápida de la verdad (isInStudentsList
). Sería súper rápido hacer ese tipo de consulta.
De lo contrario, existe una forma relativamente compleja de usar la canalización del marco de agregación para hacer lo que desea en una sola consulta:
db.students.aggregate(
{$project:
{studentId: 1, studentIdComp: "$students.id"}},
{$unwind: "$studentIdComp"},
{$project : { studentId : 1,
isStudentEqual: { $eq : [ "$studentId", "$studentIdComp" ] }}},
{$match: {isStudentEqual: true}})
Dado su ejemplo de entrada, la salida sería:
{
"result" : [
{
"_id" : ObjectId("517b88decd483543a8bdd95b"),
"studentId" : 23,
"isStudentEqual" : true
}
],
"ok" : 1
}
Una breve explicación de los pasos:
- Cree una proyección del documento con solo
studentId
y un nuevo campo con una matriz que contiene solo elid
(entonces el primer documento contendría[23, 55]
. - Usando esa estructura, $unwind
. Eso crea un nuevo documento temporal para cada elemento de la matriz en el
studentIdComp
matriz. - Ahora, tome esos documentos y cree una nueva proyección de documento, que continúa teniendo el
studentId
y agrega un nuevo campo llamadoisStudentEqual
que compara la igualdad de dos campos, elstudentId
ystudentIdComp
. Recuerde que en este punto hay un solo documento temporal que contiene esos dos campos. - Finalmente, verifique que el valor de comparación
isStudentEqual
es verdadero y devolver esos documentos (que contendrán el documento original_id
y elstudentId
. - Si el estudiante estuvo en la lista varias veces, es posible que deba agrupar los resultados en
studentId
o_id
para evitar duplicados (pero no sé si lo necesitarías).