ОБНОВЛЕНО С ИСПРАВЛЕНИЕМ: Есть ли способ l oop объекта и сохранять / обновлять документ mongodb на каждой итерации без получения ParallelSaveError? - PullRequest
0 голосов
/ 06 января 2020

Я хочу обновить документ mongodb на каждом l oop, но, похоже, не работает. Я использовал map для l oop через объект и получал

parallelSaveError: Не могу сохранить () то же самое сделать c несколько раз параллельно

Так что теперь используя asyn c .each, чтобы l oop через объект, но, кажется, mon goose только сохранить один раз. Код ниже

const openTrade = await TradeModel.find({
  $and: [{ isOpen: true }, { price: { $lte: price } }]
})
  .sort("volume")
  .where({ userId: { $ne: req.authUser._id } });
trade = async openTrade => {
  const buyerInfo = await UserModel.findById(req.authUser._id);
  const buyerWallet = await WalletModel.findById(buyerInfo.walletId);
  const sellerInfo = await UserModel.findById(openTrade.userId);
  const sellerWallet = await WalletModel.findById(sellerInfo.walletId);

  buyerWallet.balance = parseInt(buyerWallet.balance) - amountToPay;
  sellerWallet.balance = parseInt(sellerWallet.balance) + amountToPay;
  await Promise.all([sellerWallet.save(), buyerWallet.save()]);
};
async.forEachOf(openTrade, trade);

Итак, я наконец-то нашел проблему. Я не делал константу переменной customerInfo, sellerInfo и Wallets постоянной. Так что теперь это работает. Спасибо

1 Ответ

0 голосов
/ 06 января 2020

Вы можете попробовать, как показано ниже: Как и в MongoDB update Если документ содержит поле _id, тогда метод save () эквивалентен обновлению с параметром upsert, установленным в true, и предикатом запроса. в поле _id.

const openTrade = await TradeModel.find({$and:[{isOpen : true}, {price : {$lte : price}}]}).sort('volume').where({userId : {$ne : req.authUser._id } })
            trade = async (openTrade)=>{
            buyerInfo = await UserModel.findById(req.authUser._id)
            buyerWallet = await WalletModel.findById(buyerInfo.walletId)
            sellerInfo = await UserModel.findById(openTrade.userId)
            sellerWallet = await WalletModel.findById(sellerInfo.walletId)
            delete buyerWallet._id;
            delete sellerWallet._id;
            buyerWallet.balance = parseInt(buyerWallet.balance) - amountToPay
            sellerWallet.balance = parseInt(sellerWallet.balance) + amountToPay  
           await Promise.all([sellerWallet.save(), buyerWallet.save()])

        }
        async.forEachOf(openTrade, trade)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...