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

MongoDB:¿Cómo saber si un campo de matriz contiene un elemento?

[editar basado en que ahora es posible en versiones recientes]

[Respuesta actualizada] Puede consultar de la siguiente manera para recuperar el nombre de la clase y la identificación del estudiante solo si ya están inscritos.

db.student.find({},
 {_id:0, name:1, students:{$elemMatch:{$eq:ObjectId("51780f796ec4051a536015cf")}}})

y obtendrás lo que esperabas:

{ "name" : "CS 101", "students" : [ ObjectId("51780f796ec4051a536015cf") ] }
{ "name" : "Literature" }
{ "name" : "Physics", "students" : [ ObjectId("51780f796ec4051a536015cf") ] }

[Respuesta original] No es posible hacer lo que quieres hacer actualmente. Esto es desafortunado porque podría hacer esto si el estudiante estuviera almacenado en la matriz como un objeto. De hecho, estoy un poco sorprendido de que esté usando solo ObjectId() ya que siempre requiere que busque a los estudiantes si desea mostrar una lista de estudiantes inscritos en un curso en particular (busque la lista de Id primero y luego busque los nombres en la colección de estudiantes - ¡dos consultas en lugar de una!)

Si estuviera almacenando (como ejemplo) una identificación y un nombre en la matriz del curso de esta manera:

{
        "_id" : ObjectId("51780fb5c9c41825e3e21fc6"),
        "name" : "Physics",
        "students" : [
                {id: ObjectId("51780f796ec4051a536015cf"), name: "John"},
                {id: ObjectId("51780f796ec4051a536015d0"), name: "Sam"}
        ]
}

Su consulta sería simplemente:

db.course.find( { }, 
                { students : 
                    { $elemMatch : 
                       { id : ObjectId("51780f796ec4051a536015d0"), 
                         name : "Sam" 
                       } 
                    } 
                } 
);

Si ese estudiante solo estuviera inscrito en CS 101, obtendría:

{ "name" : "Literature" }
{ "name" : "Physics" }
{
    "name" : "CS 101",
    "students" : [
        {
            "id" : ObjectId("51780f796ec4051a536015cf"),
            "name" : "John"
        }
    ]
}