Mon goose значение приращения в результате операции updateMany NaN - PullRequest
0 голосов
/ 29 марта 2020

У меня есть следующая схема mon goose:

var AccountSchema = new Schema({
  amount: { type: Number, default: 0 },
  createdAt  : {type : Date, default : Date.now},
  owner: {type : Schema.Types.ObjectId, ref : 'User'},
  environment: {type : Schema.Types.ObjectId, ref : 'Environment'},
  investments: [{
    amount: { type: Number, default: 0 },
    roi: { type: Number, default: 0 },
    createdAt  : {type : Date, default : Date.now},
    code: {type : Schema.Types.ObjectId, ref : 'Code'}
  }]
});

И я хочу выполнить операцию обновления для всех объектов, для которых задан c investment.code. Я хочу увеличить сумму счета в 2 раза, вложив средства.

Примерно так:

db.accounts.updateMany({'investments.code':ObjectId("5e7f2a3e20739d171884528f")}, 
{ $inc: { "amount": 'investments.$.amount' * 2 } }
);

В результате этого записи обновляются, но учетная запись равна NaN. Я попытался преобразовать все в целое число, выполнив это, но это не работает:

{ $convert: { input: "amount", to: "int" } }

Я хочу обновить поле суммы в документе root. Вот пример:

Представьте, что у меня есть эта учетная запись:

  amount: 300,
  createdAt  : 12-01-2020,
  owner: "5e7f2a3e20739d1718845256",
  environment: "5e7f2a3e20739d1718845432",
  investments: [{
    amount: 40,
    roi: 0,
    createdAt  : 12-01-2020,
    code: "3"
  },
  {
    amount: 10,
    roi: 0,
    createdAt  : 13-01-2020,
    code: "3"
  }]

Я хочу посмотреть все вложения кода 3 и увеличить сумму на 300 с удвоением каждой сделанной инвестиции, в этом случае 40 * 2 и 10 * 2, результат будет 400 (300 + 80 + 20).

Как мне этого добиться?

Спасибо

1 Ответ

0 голосов
/ 04 апреля 2020

Наконец, я изменил стратегию обновления этих документов (вместо этого использовал updateMany для использования предложений find и forEach) и сделал:

db.accounts.find(  
{'investments.code':ObjectId("5e7f2a3e20739d171884528f")}).forEach(function (account) {
    account.investments.forEach(function (invest) {
        account.amount = account.amount + (invest.amount * 2) ;
    });
    db.accounts.save(account);
 });

, и все работает отлично!.

Спасибо.

...