Выполнить несколько запросов одновременно в Mongoose

1

Я пытаюсь объединить два запроса в Mongoose в один.

Прямо сейчас, я делаю это:

User.find({ _id: req.body.userId }, (err, user) => {
  User.find({ username: decodedUser.username }, (err, member) => {
   console.log("user\n", user)
   console.log("member\n", member)
 })
})

Я хотел бы сделать один User.find() в базу данных, а результатом будет объект (или массив) всех документов, которые я хочу, например массив [user, member] в этом случае, Это избавит меня от необходимости запускать User.find() дважды. В идеале я хотел бы, чтобы результат запроса был объектом, чтобы я мог легче найти определенный ключ/значение, в отличие от массива, который я должен был бы выполнить для поиска определенного элемента. Как мне это сделать?

Примечание: это работает:

User.find({ $or:
  [
    { _id: req.body.userId },
    { username: decodedUser.username}
  ]}, (err, results) => {
  console.log("results\n", results)
})

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

Теги:
object
arrays
mongoose

1 ответ

2
Лучший ответ

Если вы ожидаете только одного результата по обоим условиям, вы можете использовать User.findOne - он вернет первый найденный результат.

User.findOne({ $or:
  [
    { _id: req.body.userId },
    { username: decodedUser.username}
  ]}, (err, user) => {
  console.log("user\n", user)
})

редактировать

Поскольку вы сказали, что вам нужно получить 2 результата, и вы хотите получить результат, вы также можете запустить 2 запроса параллельно и использовать обещания получить результат. Например

Promise.all([
  User.find({ _id: req.body.userId }),
  User.find({ username: decodedUser.username})
]).then( ([ user, member ]) => {
  console.log( util.format( "user=%O member=%O", user, member ) );
});
  • 0
    Спасибо за ответ. Я на самом деле ожидаю два результата. Конечная цель состоит в том, чтобы запустить два User.find() за одно выполнение, а не выполнять User.find() дважды, как в моем примере выше, если это имеет смысл.
  • 0
    Тогда ваше решение выглядит лучше для меня
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню