Я пытаюсь объединить два запроса в 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
- это массив документов, которые я хочу. Но я хотел бы знать, есть ли лучший способ.
Если вы ожидаете только одного результата по обоим условиям, вы можете использовать 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 ) );
});
User.find()
за одно выполнение, а не выполнятьUser.find()
дважды, как в моем примере выше, если это имеет смысл.