Как при операции подставить значение другого поля в MongoDB?

Допустим у меня есть вот такой объект юзера в бд:

{
  _id: ...,
  username: 'Ivanas',
  balance: 0,
  bonusBalance: 10,
}

Я пытаюсь при обновлении записи обновить поле при этом используя значение другого поля

Что-то типа такого:

user.findOneAndUpdate({_id}, {$inc: {balance: this.bonusBalance }})

Возможно ли так сделать в монге?


Ответы (2 шт):

Автор решения: Rudi

Я пытаюсь при обновлении записи обновить поле при этом используя значение другого

Не очень понятно, что сделать надо. Переименовать поле, или значение поля - заменить значением другого поля, этого же документа, или исходя из предоставленного ответа увеличить значение на...

В твоём ответе, если добавить пропущенную скобку, результат будет выглядеть так:


{
    "_id" : "bal",
    "username" : "Ivanas",
    "balance" : {
        "$sum" : [ 
            "$bonusBalance", 
            "$balance"
        ]
    },
    "bonusBalance" : 10
}

Можно воспользоваться методом stream()

const { MongoClient } = require('mongodb');
const client = new MongoClient(url, { useNewUrlParser: true });
const url = "mongodb+srv://....";

client.connect(async (err) => {

    const db = await client.db("dbName");
    const collection = await db.collection('nameCollection');

    const stream = await collection.find({_id: 'bal'}).stream();

    await stream.on('error', function (err) {
      console.error(err,'error');
    });

    await stream.on('data', function (doc) {
      collection.updateOne({_id: doc._id}, 
        //{ $rename: {"balance": String(doc.bonusBalance)}},// Переименовать поле присвоить значение другого поля этого документа
        //{ $set: {"balance": doc.bonusBalance}},// вставить значение поля bonusBalance этого документа в значение поля balance этого документа
        { $inc: {"balance": doc.bonusBalance}},// увеличить значение поля balance на значение из поля bonusBalance этого документа
        function(err, result) { console.log(err, result.result)}
      )
    });

    await stream.on('end', function () {
      console.log('enderror');
      client.close();
    });
});

→ Ссылка