Mongodb updateone with $set and $currentDate throws error code 40 after second update
我正在使用node和mongodb,并且我想更新文档并添加修改日期。我第二次更新时遇到问题。第二次失败的特定情况是因为:
- 该文档已经存在,但没有" lastModified"字段。
- 首次修改会在" lastModified"字段中添加正确的值。
- 第二次修改必须使用当前日期更新" lastModified"字段,但失败。
显示的错误是:
{"driver":true,"name":"MongoError","index":0,"code":40,"errmsg":"Updating the path 'lastModified' would create a conflict at 'lastModified'"},"params":null}}
mongo中的文档为:
1 2 3 4 | { _id" : ObjectId("5af07316fc5f13c574ba825b"), "field1" :"value1" } |
我要更新的代码是:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | 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(); })(); |
第一次更新后,数据库中的文档为:
1 2 3 4 5 | { _id" : ObjectId("5af07316fc5f13c574ba825b"), "field1" :"value1", "lastModified" : ISODate("2018-09-07T23:18:21.485Z") } |
哪个是正确的。
第二次尝试更新时,它失败。
我正在使用:
1 2 | "mongodb":"^3.1.4", "node":"^10.10.0", |
关于什么可能是错误的任何建议?
编辑:
第一次更新后,将从数据库中获取数据,然后执行第二次更新。
由于$ set中的对象包含还将由$ currentDate设置的属性而引发错误。解决方案是确保如果由任何更新运算符设置该属性,则newData中将不存在该属性。
在这种情况下,在更新之前,请清洁newData并确保其不具有lastModified属性,因为它将由更新操作符$ currentDate:
进行修改。
1 2 3 4 5 6 7 8 9 10 11 | ... // 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错误代码列表可在此处找到,但显然没有有关这些代码的描述或问题的官方文档(显然已通过此提交而删除)。
这解决了问题。
感谢@Greg指出了正确的方向。