#mongodb #mongodb-query #aggregation-framework
#mongodb #mongodb-запрос #агрегация-фреймворк
Вопрос:
Итак, у меня в коллекции есть документы testdb
, подобные следующим:
{
"name": {
"first": "Joe",
"last": "Johnson"
},
"ssn": "1012313",
"semester": [{
"semesterName": "Spring2021",
"courses": [{
"title": "Calculus 1",
"professor": "Erik Paulson",
"TA": "Paul Matthews"
},
{
"title": "Computer Science 1",
"professor": "Dennis Ritchie",
"TA": "Ken Thompson"
}
]
}]
}
Я хотел бы вычислить ssn
всех студентов, которые изучают математическое исчисление 1, но не изучают информатику 1.
Чтобы найти ssn
всех студентов, которые изучают Исчисление 1, у меня есть следующий запрос:
db.testcol.aggregate([
{ $match : { "semester.courses.title": "Calculus 1" } },
{ $project : { "ssn": 1, "_id": 0 } }
]);
и чтобы найти ssn
всех студентов, изучающих информатику 1, у меня есть:
db.testcol.aggregate([
{ $match : { "semester.courses.title": "Computer Science 1" } },
{ $project : { "ssn": 1, "_id": 0 } }
]);
Я хочу вычислить заданную разницу между двумя наборами ssn
, которые в SQL были бы простым NOT IN
выражением между двумя подзапросами, но мне трудно понять, как это сделать в Mongo.
Я пытался посмотреть $setDifference
, но это должно работать с массивами. Как я могу объединить два запроса и найти разницу между ними?
Ответ №1:
Вы можете объединить два запроса в одну агрегацию следующим образом:
db.testcol.aggregate([
{
$match: {
"semester.courses.title": {
$eq: "Calculus 1",
$ne: "Computer Science 1"
}
}
},
{
$project: {
"ssn": 1,
"_id": 0
}
}
])
$eq
Оператор ищет хотя бы один элемент semester.courses
массива, который имеет title
значение of Calculus 1
, и $ne
оператор проверяет, что ни один элемент не имеет title
значения of Computer Science 1
.