具有$ set和$ currentDate的Mongodb updateone在第二次更新后引发错误代码40

时间:2018-09-08 16:14:55

标签: node.js mongodb

我正在使用node和mongodb,并且我想更新文档并添加修改日期。我第二次更新时遇到问题。第二次失败的特定情况是因为:

  • 该文档已经存在,但没有“ lastModified”字段。
  • 第一次修改会为“ lastModified”字段添加正确的值。
  • 第二次修改必须使用当前日期更新'lastModified'字段,但失败。

显示的错误是:

  

{“驱动程序”:true,“名称”:“ MongoError”,“索引”:0,“代码”:40,“ errmsg”:“更新路径“ lastModified”会在“ lastModified”处产生冲突” },“ params”:null}}

mongo中的文档为:

{
    _id" : ObjectId("5af07316fc5f13c574ba825b"),
    "field1" : "value1"
}

我要更新的代码是:

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

let url = 'some mongo url';
let database = 'some database';
let newData = {'field1':'newValue1'}

(async function() {
    let client;
    try {
        client = await MongoClient.connect(url , {useNewUrlParser: true});
        let database = client.db(database);
        let result = await database.collection(collection).updateOne(filter, {
                $set: newData,
                $currentDate: {'lastModified': true}
            });

        assert.equal(1, result.matchedCount);
        assert.equal(1, result.modifiedCount);

        // Close connection
        client.close();
    } catch (err) {
        console.log(err.stack);
    }

    // Close connection
    client.close();
})();

第一次更新后,数据库中的文档为:

{
    _id" : ObjectId("5af07316fc5f13c574ba825b"),
    "field1" : "value1",
    "lastModified" : ISODate("2018-09-07T23:18:21.485Z")
}

这是正确的。 第二次尝试更新时,失败。

我正在使用:

"mongodb": "^3.1.4",
"node": "^10.10.0",

关于什么可能是错误的任何建议?

编辑:

第一次更新后,将从数据库中获取数据,然后执行第二次更新。

1 个答案:

答案 0 :(得分:1)

由于$ set中的对象包含还将由$ currentDate设置的属性而引发错误。解决方案是,如果该属性由任何update operator设置,请确保该属性在newData中不存在。

在这种情况下,在更新之前,请清洁newData并确保其不具有lastModified属性,因为它将由更新操作符$ currentDate修改:

...
// remove any property that will be used by update operators
if (newData && newData.hasOwnProperty('lastModified')) {
    delete newData['lastModified'];
}

let result = await database.collection(collection).updateOne(filter, {
            $set: newData,
            $currentDate: {'lastModified': true}
        });
...

Mongodb错误代码40

错误代码40引用“ ConflictingUpdateOperators”,这是更新操作符中的属性冲突。在这种情况下,它与$ set中的另一个属性发生冲突,因此如果任何人遇到这种情况,请检查您是否不在同一命令中两次更新同一属性。

完整的Mongodb Error Code List is available here,但显然没有有关这些代码的描述或问题的官方文档(显然已由this commit删除)。

这解决了问题。 感谢@Greg指出了正确的方向。