У меня две коллекции. Первая коллекция содержит учеников:
{ "_id" : ObjectId("51780f796ec4051a536015cf"), "name" : "John" }
{ "_id" : ObjectId("51780f796ec4051a536015d0"), "name" : "Sam" }
{ "_id" : ObjectId("51780f796ec4051a536015d1"), "name" : "Chris" }
{ "_id" : ObjectId("51780f796ec4051a536015d2"), "name" : "Joe" }
Вторая коллекция содержит курсы:
{
"_id" : ObjectId("51780fb5c9c41825e3e21fc4"),
"name" : "CS 101",
"students" : [
ObjectId("51780f796ec4051a536015cf"),
ObjectId("51780f796ec4051a536015d0"),
ObjectId("51780f796ec4051a536015d2")
]
}
{
"_id" : ObjectId("51780fb5c9c41825e3e21fc5"),
"name" : "Literature",
"students" : [
ObjectId("51780f796ec4051a536015d0"),
ObjectId("51780f796ec4051a536015d0"),
ObjectId("51780f796ec4051a536015d2")
]
}
{
"_id" : ObjectId("51780fb5c9c41825e3e21fc6"),
"name" : "Physics",
"students" : [
ObjectId("51780f796ec4051a536015cf"),
ObjectId("51780f796ec4051a536015d0")
]
}
В каждом документе курса содержится массив students
, в котором есть список студентов, зарегистрированных для курса. Когда студент просматривает курс на веб-странице, ему нужно посмотреть, зарегистрирован ли он на курс или нет. Для этого, когда коллекция courses
получает запрос от имени студента, нам нужно выяснить, содержит ли массив students
ученик ObjectId. Есть ли способ указать в проекции запроса на поиск для извлечения студента ObjectId
из массива students
только в том случае, если он есть?
Я попытался выяснить, могу ли я использовать оператор $elemMatch, но он ориентирован на массив поддокументов. Я понимаю, что я мог бы использовать структуру агрегации, но, похоже, в этом случае он будет перегружен. Структура агрегирования, вероятно, не будет такой быстрой, как один запрос на поиск. Есть ли способ запросить сбор курсора таким образом, чтобы возвращаемый документ мог быть в форме, подобной этому?
{
"_id" : ObjectId("51780fb5c9c41825e3e21fc4"),
"name" : "CS 101",
"students" : [
ObjectId("51780f796ec4051a536015d0"),
]
}