Необходимо преобразовать массив идентификаторов пользователей в идентификаторы объектов для использования в агрегатной функции

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

Конвейер агрегации не приводит значения автоматически, поэтому вам нужно будет создать массив таким образом, чтобы он содержал соответствующие типы данных для сопоставления.