在更新

时间:2017-09-08 14:13:54

标签: node.js mongodb

我有以下文档

{ "价值":5 }

我希望更新能够实现以下目标:

{ " value_old":5, "价值":3 }

我正在尝试使用以下更新查询来实现此目的

      {
        $rename: {"value": "value_old"}
      },
      { $set :{
        "value": (wtv new value was sent to the function) 3
      }

此代码似乎无法正常工作.... 我不想执行两个单独的更新查询

我已经尝试了汇总和最后一个$ out,但这会导致删除整个集合,我只想更新单个文档。

我这样做的原因是因为我需要将操作变为原子操作。我刚刚读了db.eval(),它看起来很有希望,因为它会锁定数据库的读写。有谁知道如何使用db.eval()来执行2次更新?

1 个答案:

答案 0 :(得分:0)

如果使用MongoClient,则可以以异步方式处理。例如:

const MongoClient = require('mongodb').MongoClient;

function updateDB (newVal) {
  return MongoClient.connect(MONGODB_URL)
    .then( (database) => {
      return Promise.all([
        database.collection('yourCollection').update({id: 123}, {$rename: {'value': 'value_old'}}),
        database.collection('yourCollection').update({
            $set: {'value': newVal}
        })
      ])
      .then(() => {
        database.close(true);
      })
      .then(() => {
        return `new value: ${newVal} has been updated in : ${whatever}`;
      })
      .catch((err) => {
        database.close(true);
        throw err;
      });
    })
}

这就是我所做的,并且只有在所有操作完成后才能安全执行许多操作并关闭数据库。