Как установить совокупные значения в документе mongodb? - PullRequest
0 голосов
/ 29 января 2020

Я бы хотел установить значение, добавив другое значение к себе во время обновления. До сих пор я пытаюсь использовать обновления с линиями агрегации , чтобы установить значение в качестве накопителя следующим образом:

(async function(){
try{
    var MongoClient = require('mongodb').MongoClient;
    var url = "mongodb://localhost:27017/";
    const client = await MongoClient.connect(url, {
        useNewUrlParser: true,
        useUnifiedTopology: true,
    });

    const db = await client.db('mydb');

    const myCollection = await db.collection('myCollection');

    await myCollection.createIndex({name:1},{unique:true}).catch(reason => console.error(reason));

    for (let i=0;i<7;i++){

        let docExists = await myCollection.findOne({name : 'test'});

        if (await docExists == null){

            await myCollection.updateOne({name : 'test'},{$set: {name : 'test',cumulativeVal : i}}, function(err, res){if (err) throw err;});
        }
        else {
            await myCollection.updateOne({name : 'test'},{$set: {name : 'test',cumulativeVal : {$add: [$cumulativeVal,i]}}}, function(err, res){if (err) throw err;});
        }
    }
    let result = await myCollection.find({})//.catch(e => { throw e; });;
    console.log('Result: ',await result.toArray());
    client.close();
    }
    catch(err){console.error(err); }


})()

В примере я ожидаю, что окончательная запись будет (Я получаю []):

{name: "test", cumulativeVal : 21}

Я думаю, что я неправильно использую операцию $add здесь. Редактировать (на самом деле он не доходит до оператора else) ...

Существует ли стандартный способ задания совокупных значений в документе mongodb?

1 Ответ

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

Мне удалось это сделать:

Мне нужно было поменять первое updateOne с $set на insertOne:

(async function(){
try{
    var MongoClient = require('mongodb').MongoClient;
    var url = "mongodb://localhost:27017/";
    const client = await MongoClient.connect(url, {
        useNewUrlParser: true,
        useUnifiedTopology: true,
    });

    const db = await client.db('mydb');

    const myCollection = await db.collection('myCollection');

    await myCollection.createIndex({name:1},{unique:true}).catch(res => console.error(res));

    for (let i=0;i<7;i++){

        let docExists = await myCollection.findOne({name : 'test'});
        console.log(await docExists)
        if ( docExists == null){
            console.log("null")
            await myCollection.insertOne({name : 'test',"cumulativeVal" : i}, function(err, res){if (err) throw err;});
        }
        else {
          console.log("i",i)
            await myCollection.updateOne({name : 'test'},[{$set: {"cumulativeVal" : {$add: ["$cumulativeVal",i]}}}], function(err, res){if (err) throw err;});
        }
    }
    let result = await myCollection.find({})//.catch(e => { throw e; });;
    console.log('Result: ',await result.toArray());
    client.close();
    }
    catch(err){console.error(err); }


})()

Кажется, что может быть больше краткий способ однако ...

...