Вы должны использовать оператор агрегирования, $ setIsSubset . Оператор $ in (агрегат) используется для проверки массива только на значение one . Я думаю, вы думаете о $ in (оператор запроса) ..
Запрос:
db.student_subjects.aggregate( [
{ $group: {
_id: "$student",
studentSubjects: { $addToSet: "$subject" }
}
},
{ $project: {
subjectMatches: { $setIsSubset: [ [ "Language", "Math" ], "$studentSubjects" ] }
}
},
{ $match: {
subjectMatches: true
}
},
{ $project: {
matched_student: "$_id", _id: 0
}
}
] )
Результат:
{ "matched_student" : "A" }
ПРИМЕЧАНИЯ:
Если вы замените [ "Language", "Math" ]
на [ "History" ]
, вы получите результат: { "matched_student" : "B" }
.
Вы также можете попробовать и посмотреть другие операторы множеств (агрегация) , например $allElementsTrue
. Используйте лучший, который подходит для вашего приложения.
[РЕДАКТИРОВАТЬ ДОБАВИТЬ] Пример данных для student_subjects
коллекция:
{ "_id" : 1, "student" : "A", "subject" : "Language" }
{ "_id" : 2, "student" : "A", "subject" : "Math" }
{ "_id" : 3, "student" : "B", "subject" : "Science" }
{ "_id" : 4, "student" : "A", "subject" : "Arts" }
{ "_id" : 5, "student" : "C", "subject" : "Biology" }
{ "_id" : 6, "student" : "B", "subject" : "History" }
Результат после каждого этапа:
1-й этап: $group
{ "_id" : "C", "studentSubjects" : [ "Biology" ] }
{ "_id" : "B", "studentSubjects" : [ "History", "Science" ] }
{ "_id" : "A", "studentSubjects" : [ "Arts", "Math", "Language" ] }
2-йЭтап: $project
{ "_id" : "C", "subjectMatches" : false }
{ "_id" : "B", "subjectMatches" : false }
{ "_id" : "A", "subjectMatches" : true }
3-й этап: $match
{ "_id" : "A", "subjectMatches" : true }
4-й этап: $project
{ "matched_student" : "A" }