[edytuj w oparciu o to, co jest teraz możliwe w najnowszych wersjach]
[Zaktualizowana odpowiedź] Możesz zapytać w następujący sposób, aby odzyskać nazwę klasy i identyfikator ucznia tylko wtedy, gdy są już zarejestrowani.
db.student.find({},
{_id:0, name:1, students:{$elemMatch:{$eq:ObjectId("51780f796ec4051a536015cf")}}})
a otrzymasz to, czego się spodziewałeś:
{ "name" : "CS 101", "students" : [ ObjectId("51780f796ec4051a536015cf") ] }
{ "name" : "Literature" }
{ "name" : "Physics", "students" : [ ObjectId("51780f796ec4051a536015cf") ] }
[Oryginalna odpowiedź] Obecnie nie można robić tego, co chcesz. Jest to niefortunne, ponieważ byłbyś w stanie to zrobić, gdyby uczeń był przechowywany w tablicy jako obiekt. W rzeczywistości jestem trochę zaskoczony, że używasz tylko ObjectId(), ponieważ to zawsze wymagają wyszukania uczniów, jeśli chcesz wyświetlić listę uczniów zapisanych na konkretny kurs (najpierw wyszukaj listę identyfikatorów, a następnie wyszukaj nazwiska w zbiorze uczniów - dwa zapytania zamiast jednego!)
Jeśli zapisałeś (jako przykład) identyfikator i nazwę w tablicy kursów w następujący sposób:
{
"_id" : ObjectId("51780fb5c9c41825e3e21fc6"),
"name" : "Physics",
"students" : [
{id: ObjectId("51780f796ec4051a536015cf"), name: "John"},
{id: ObjectId("51780f796ec4051a536015d0"), name: "Sam"}
]
}
Twoje zapytanie byłoby wtedy po prostu:
db.course.find( { },
{ students :
{ $elemMatch :
{ id : ObjectId("51780f796ec4051a536015d0"),
name : "Sam"
}
}
}
);
Gdyby ten uczeń był zapisany tylko do CS 101, wrócisz:
{ "name" : "Literature" }
{ "name" : "Physics" }
{
"name" : "CS 101",
"students" : [
{
"id" : ObjectId("51780f796ec4051a536015cf"),
"name" : "John"
}
]
}