Как сделать несколько, найти и обновить несколько коллекций эффективно / с высокой производительностью? - PullRequest
0 голосов
/ 01 января 2019

Я использую 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({

                    })
                })

            })
        })

    })
})

Ответы [ 2 ]

0 голосов
/ 01 января 2019

Как и в ответе @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
  }
}
0 голосов
/ 01 января 2019

используйте взамен findOneAndUpdate.Это поможет немного.См. Документацию: https://mongoosejs.com/docs/api.html#model_Model.findOneAndUpdate

И попробуйте избежать обратных вызовов, вместо этого используйте async await, поскольку mongoose вернет обещание в любой операции с БД.

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) {
        //
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...