Mon go DB - Как создать поле Dynami c на основе наличия элемента в массиве? - PullRequest
2 голосов
/ 24 января 2020

У меня есть проблема в понедельник go, из-за которой я не получаю никаких подсказок для ее эффективного решения.

Скажем, у меня есть коллекция 'Course' примерно такая (индекс создается для 'studentIds 'field):

{
    "courseId": 1,
    "name": "Mathematics",
    "studentIds": [1,3,5]
    ...
    ...
}
{
    "courseId": 2,
    "name": "Physics",
    "studentIds": [2,3,5]
    ...
    ...
}

Я пытаюсь написать запрос, который будет возвращать записи в следующем формате:

Скажем, студент 1 запрашивает курсы, он записан на CourseId 1, таким образом, «зарегистрировано» является истинным, но учащийся 1 не зарегистрирован для CourseId 2, и поэтому «зарегистрировано» является ложным:

{
    "courseId": 1,
    "name": "Mathematics",
    "enrolled": true
}
{
    "courseId": 2,
    "name": "Physics",
    "enrolled": false
}

Единственное решение, которое я могу придумать, - это два запроса, первый запрос для поиска всех идентификаторы курсов, в которые зачислен учащийся, и, пробежав курсором по курсам во втором запросе, добавьте поле 'enrolled', основанное на существовании идентификатора курса в результате первого запроса, но ищите способ добиться этого в один запрос.

Спасибо.

1 Ответ

2 голосов
/ 24 января 2020

Вам просто нужно $ в оператор:

let studentId = 1;
db.collection.aggregate([
    {
        $project: {
            courseId: 1,
            name: 1,
            enrolled: { $in: [ studentId, "$studentIds" ] }
        }
    }
])

Пн go Детская площадка

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...