#mongodb #mongoose #aggregate
#mongodb #мангуст #агрегат
Вопрос:
Я работал над некоторым старым кодом, используя aggregate framework. Агрегат выглядит примерно так:
User.aggregate([
{ $match: {
_id: { $in: invitedUserObjectIds, $ne: game.createdBy._id },
...
},
...
]
Первоначально код имел идентификаторы пользователей в виде строк, подобных so ['qwertyuiop',...]
. Это работало.
Теперь, чтобы заставить его работать должным образом, я должен преобразовать каждый идентификатор строки в ObjectId перед передачей нового массива ObjectId на $match
этап агрегированного конвейера.
Не имеет большого значения, но пытаюсь понять, почему это так, или я упускаю что-то простое? Я протестировал точно такой же запрос, только invitedUserObjectIds
изменив либо массив идентификаторов строк, либо массив идентификаторов объектов.
Ответ №1:
Операторы запросов MongoDB чувствительны к типу.
Для правильного сопоставления тип данных аргумента в запросе должен соответствовать типу данных поля в документе, хранящемся в базе данных.
Функции запроса, подобные findById
в mongoose, приводят переданный аргумент к типу, объявленному в схеме для поля _id.
Конвейер агрегации не приводит значения автоматически, поэтому вам нужно будет создать массив таким образом, чтобы он содержал соответствующие типы данных для сопоставления.