[編集 これに基づいて、最近のバージョンで可能になりました]
[更新された回答]次の方法でクエリを実行して、クラスの名前と学生IDが既に登録されている場合にのみ、それらを取得できます。
db.student.find({},
{_id:0, name:1, students:{$elemMatch:{$eq:ObjectId("51780f796ec4051a536015cf")}}})
そして、あなたはあなたが期待したものを取り戻すでしょう:
{ "name" : "CS 101", "students" : [ ObjectId("51780f796ec4051a536015cf") ] }
{ "name" : "Literature" }
{ "name" : "Physics", "students" : [ ObjectId("51780f796ec4051a536015cf") ] }
【元の回答】現在やりたいことはできません。学生がオブジェクトとして配列に格納されている場合、これを実行できるため、これは残念です。実際、ObjectId()だけを使用していることに少し驚いています。常に 特定のコースに登録されている学生のリストを表示する場合は、学生を検索する必要があります(Idのリストを最初に検索してから、学生コレクションの名前を検索します。1つではなく2つのクエリです!)
(例として)IDと名前を次のようにコース配列に格納している場合:
{
"_id" : ObjectId("51780fb5c9c41825e3e21fc6"),
"name" : "Physics",
"students" : [
{id: ObjectId("51780f796ec4051a536015cf"), name: "John"},
{id: ObjectId("51780f796ec4051a536015d0"), name: "Sam"}
]
}
その場合、クエリは次のようになります。
db.course.find( { },
{ students :
{ $elemMatch :
{ id : ObjectId("51780f796ec4051a536015d0"),
name : "Sam"
}
}
}
);
その学生がCS101にのみ登録されていた場合は、戻ってきます:
{ "name" : "Literature" }
{ "name" : "Physics" }
{
"name" : "CS 101",
"students" : [
{
"id" : ObjectId("51780f796ec4051a536015cf"),
"name" : "John"
}
]
}