sql >> Base de Datos >  >> NoSQL >> MongoDB

campos coincidentes internamente en mongodb

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:

  1. Cree una proyección del documento con solo studentId y un nuevo campo con una matriz que contiene solo el id (entonces el primer documento contendría [23, 55] .
  2. Usando esa estructura, $unwind . Eso crea un nuevo documento temporal para cada elemento de la matriz en el studentIdComp matriz.
  3. Ahora, tome esos documentos y cree una nueva proyección de documento, que continúa teniendo el studentId y agrega un nuevo campo llamado isStudentEqual que compara la igualdad de dos campos, el studentId y studentIdComp . Recuerde que en este punto hay un solo documento temporal que contiene esos dos campos.
  4. Finalmente, verifique que el valor de comparación isStudentEqual es verdadero y devolver esos documentos (que contendrán el documento original _id y el studentId .
  5. 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).