Как обновить несколько массивов в документе? - PullRequest
0 голосов
/ 04 октября 2019

Учитывая схему мангуста, как я пытаюсь использовать этот POST, чтобы получить текущую цену акции и сопоставить ее с балансом пользователя. Если запас меньше пользовательского баланса, он должен быть вычтен из баланса. После этого портфель должен обновить общее количество акций, если он принадлежит пользователю, и передать транзакцию в массив пользователей.

var UserSchema = new mongoose.Schema({
    email : { type: String, unique: true, required: true, trim: true},
    name  : { type: String, required: true},
    password : { type: String, required: true},
    balance : {type: Number, default: 5000},
    transactions : [
        {
            name : { type: String, required: true},
            buy_or_sell : {type: Boolean, required: true},
            shares : {type: Number, required: true},
            value : {type: Number, required: true}
        }
    ],
    portfolio : [
        {
            name : { type: String, unique: true, required: true },
            shares : { type: Number, required: true }
        }
    ]

});
router.post('/portfolio', (req, res, next)=>{
  if (req.session.userId !== undefined){

    var ticker = (req.body.ticker).toLowerCase();
    var qty = req.body.qty;

    User.findOne({ _id: req.session.userId }).exec(async function(err, user) {
      var balance = user.balance;
      const data = await alpha.data.quote(`${ticker}`);
      var sum = Number((data['Global Quote']['05. price'] * qty).toFixed(2));
      if (sum < balance){
        let total = Number(balance-sum).toFixed(2)
        let doc = await User.findOneAndUpdate({_id: req.session.userId}, {balance : sum})
        ....
        ....
      }
    });

  } else {
    res.redirect('/')
  }

});

1 Ответ

1 голос
/ 04 октября 2019

В одном запросе вы можете обновить несколько полей документа. Чтобы добавить новую запись в массив, используйте $push. Чтобы обновить определенный элемент массива, он более сложен, вам нужно использовать $set и $ с фильтром, чтобы узнать, какой элемент нужно обновить.

Нечто подобное должно сработать:

await User.findOneAndUpdate(
    {
        _id: req.session.userId,
        portfolio.name 'indicateHereThePortfolioNameYouWantToUpdate'
    }, 
    {
        $push: {transactions: transactionToAdd}
        $set: {
            balance: sum,
            portfolio.$.shares: newShareValue
        }
    });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...