[modifier basé sur ce qui est désormais possible dans les versions récentes]
[Réponse mise à jour] Vous pouvez interroger la méthode suivante pour récupérer le nom de la classe et l'identifiant de l'étudiant uniquement s'ils sont déjà inscrits.
db.student.find({},
{_id:0, name:1, students:{$elemMatch:{$eq:ObjectId("51780f796ec4051a536015cf")}}})
et vous obtiendrez ce que vous attendiez :
{ "name" : "CS 101", "students" : [ ObjectId("51780f796ec4051a536015cf") ] }
{ "name" : "Literature" }
{ "name" : "Physics", "students" : [ ObjectId("51780f796ec4051a536015cf") ] }
[Réponse originale] Il n'est pas possible de faire ce que vous voulez faire actuellement. C'est malheureux car vous seriez capable de le faire si l'élève était stocké dans le tableau en tant qu'objet. En fait, je suis un peu surpris que vous utilisiez uniquement ObjectId() car cela sera toujours vous oblige à rechercher les étudiants si vous souhaitez afficher une liste des étudiants inscrits à un cours particulier (recherchez d'abord la liste des identifiants, puis recherchez les noms dans la collection des étudiants - deux requêtes au lieu d'une !)
Si vous stockiez (par exemple) un identifiant et un nom dans le tableau du cours comme ceci :
{
"_id" : ObjectId("51780fb5c9c41825e3e21fc6"),
"name" : "Physics",
"students" : [
{id: ObjectId("51780f796ec4051a536015cf"), name: "John"},
{id: ObjectId("51780f796ec4051a536015d0"), name: "Sam"}
]
}
Votre requête serait alors simplement :
db.course.find( { },
{ students :
{ $elemMatch :
{ id : ObjectId("51780f796ec4051a536015d0"),
name : "Sam"
}
}
}
);
Si cet étudiant n'était inscrit qu'au cours CS 101, vous obtiendriez :
{ "name" : "Literature" }
{ "name" : "Physics" }
{
"name" : "CS 101",
"students" : [
{
"id" : ObjectId("51780f796ec4051a536015cf"),
"name" : "John"
}
]
}