Как вычислить разницу между подзапросами в MongoDB

#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 .