Как при операции подставить значение другого поля в MongoDB?
Допустим у меня есть вот такой объект юзера в бд:
{
_id: ...,
username: 'Ivanas',
balance: 0,
bonusBalance: 10,
}
Я пытаюсь при обновлении записи обновить поле при этом используя значение другого поля
Что-то типа такого:
user.findOneAndUpdate({_id}, {$inc: {balance: this.bonusBalance }})
Возможно ли так сделать в монге?
Ответы (2 шт):
user.findOneAndUpdate({_id}, [{$set: {balance: { $sum: ['$bonusBalance', '$balance'] }}}])
https://stackoverflow.com/questions/3974985/update-mongodb-field-using-value-of-another-field
Я пытаюсь при обновлении записи обновить поле при этом используя значение другого
Не очень понятно, что сделать надо. Переименовать поле, или значение поля - заменить значением другого поля, этого же документа, или исходя из предоставленного ответа увеличить значение на...
В твоём ответе, если добавить пропущенную скобку, результат будет выглядеть так:
{
"_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();
});
});