Я использую mongodb и nodejs, мой вариант использования такой:
Когда пользователь покупает продукт, и его оценка сохраняется в его пользовательском документе, мне нужно будет обновить документ продукта, чтобы уменьшить его запас, затем нужно уменьшить оценку пользователя в пользовательском документе, а затем нужно будет создать запись транзакции. Здесь задействованы три коллекции, следует ли мне 3 раза выполнить findOne и Save () во вложенной структуре обещания?
Или есть другой способ сделать это более эффективно?
В настоящее время я использую mongoese, мне следует переключиться на официальный клиент mongodb?
Collection1.findOne( doc1 => {
doc1.save().then({
Collection2.findOne( doc2 => {
doc1.save().then({
Collection3.findOne( doc3 => {
doc1.save().then({
})
})
})
})
})
})
Спасибо @omarwaleed, но сейчас мне нужно, чтобы ты придерживался mongodb3.4





вместо этого используйте findOneAndUpdate. Это немного поможет. См. Документацию: https://mongoosejs.com/docs/api.html#model_Model.findOneAndUpdate
И постарайтесь избегать обратных вызовов, вместо этого используйте async await, поскольку mongoose вернет обещание в любой операции db.
async function purchase() {
try {
let doc1 = await Collection1.findOneAndUpdate(
condition,
updatedDoc
);
let doc2 = await Collection2.findOneAndUpdate(
condition,
updatedDoc
);
let doc3 = await Collection3.findOneAndUpdate(
condition,
updatedDoc
);
} catch(err) {
//
}
}
Как и в ответе @Raj Kumar, вы должны использовать асинхронную функцию, но я хотел бы добавить к этому использование Promise.all вместо ожидания каждого запроса отдельно. Окончательный код будет
async function purchase() {
try {
let promise1 = Collection1.findOneAndUpdate(
condition,
update
);
let promise2 = Collection2.findOneAndUpdate(
condition,
update
);
let promie3 = Collection3.findOneAndUpdate(
condition,
update
);
let result = await Promise.all([promise1, promise2, promise3])
} catch(err) {
// handle error in any promise
}
}
правильный! ожидание выполнения одной операции не требуется, если вы просто выполняете операцию записи или результат одной операции зависит от другой. Ваше здоровье!
если вы используете MongoDB версии 4+, вы можете рассмотреть возможность использования транзакций (просто примечание, транзакции доступны только в среде набора реплик)