Ако е възможно, предлагам да зададете условието, докато съхранявате данните, така че да можете да направите бърза проверка за истинност (isInStudentsList
). Би било супер бързо да направите такъв тип заявка.
В противен случай има сравнително сложен начин за използване на конвейера на рамката за агрегиране, за да направите това, което искате в една заявка:
db.students.aggregate(
{$project:
{studentId: 1, studentIdComp: "$students.id"}},
{$unwind: "$studentIdComp"},
{$project : { studentId : 1,
isStudentEqual: { $eq : [ "$studentId", "$studentIdComp" ] }}},
{$match: {isStudentEqual: true}})
Предвид вашия пример за въвеждане, изходът ще бъде:
{
"result" : [
{
"_id" : ObjectId("517b88decd483543a8bdd95b"),
"studentId" : 23,
"isStudentEqual" : true
}
],
"ok" : 1
}
Кратко обяснение на стъпките:
- Изградете проекция на документа само с
studentId
и ново поле с масив, съдържащ самоid
(така че първият документ ще съдържа[23, 55]
. - Използвайки тази структура, $unwind
. Това създава нов временен документ за всеки елемент от масива в
studentIdComp
масив. - Сега вземете тези документи и създайте нова проекция на документ, която продължава да има
studentId
и добавя ново поле, нареченоisStudentEqual
който сравнява равенството на две полета,studentId
иstudentIdComp
. Не забравяйте, че в този момент има един временен документ, който съдържа тези две полета. - Накрая проверете дали сравнителната стойност
isStudentEqual
е вярно и връща тези документи (които ще съдържат оригиналния документ_id
иstudentId
. - Ако ученикът е бил в списъка няколко пъти, може да се наложи да групирате резултатите по
studentId
или_id
за предотвратяване на дублиране (но не знам дали имате нужда от това).