Mongoose найти, где массив содержит хотя бы один объект, который соответствует идентификатору

#node.js #mongoose

#node.js #mongoose

Вопрос:

Я использую Mongoose. У меня есть следующая модель:

 person = {
    name: String,
    projects: [
        {
            projectId: {
                type:mongoose.Schema.Types.ObjectId,
                required:true
            },
            userNotes: {
                type: String
            }
        }
    ]
};
  

Я хочу иметь возможность находить всех пользователей, у которых есть хотя бы один проект с идентификатором проекта в списке const projectIds = ['aafefaeiIE2afd', 'afeaf33afe','gg3r3a'] . Я пытался сделать что-то вроде этого:

 const results = Person.find({projects:{$exists:true,$contains:projectIds}});
  

Но, очевидно, это не сработает, потому что a) у mongoose нет a $contains и b) person.projects это массив объектов, а не массив строк, и мне нужно сопоставить объекты projectId .

Как мне заставить mongoose выполнить запрос, который я ищу?

Ответ №1:

Я не уверен, что это именно то, что вы ищете, но, насколько я понимаю, это может помочь.

 db.collection.find({
  "projects": {
    "$elemMatch": {
      "projectId": {
        "$in": [
          "aafefaeiIE2afd" //<-- You can use your array here instead
        ]
      }
    }
  }
})
  

Ссылка на игровую площадку

Комментарии:

1. Я заменил db.collection на Person . Но это вернуло нулевые результаты. Обратите внимание, что я работаю с Mongoose в приложении NodeJS и не работаю напрямую с базой данных mongodb. Есть ли у меня способ «вводить необработанные запросы» в mongodb из mongoose?

2. Возможно ли это, если вы предоставите образец данных для запроса? Mongoose — это оболочка MongoDB , поэтому все запросы должны работать

Ответ №2:

Вы можете использовать точечную нотацию с $in для ее решения:

 Person.find({
  "projects.projectId": {
    $in: your_array
  }
})
  

Игровая площадка Mongo