node.js - 带有 $set 和 $currentDate 的 Mongodb updateone 在第二次更新后抛出错误代码 40
问题描述
我正在使用node和mongodb,我想更新一个文档并添加修改日期。我第二次更新时遇到问题。第二次失败的具体情况是因为:
- 该文档已经存在,但没有“lastModified”字段。
- 第一次修改添加具有正确值的“lastModified”字段。
- 第二次修改必须用当前日期更新“lastModified”字段但失败。
显示的错误是:
{"driver":true,"name":"MongoError","index":0,"code":40,"errmsg":"更新路径 'lastModified' 会在 'lastModified' 处产生冲突"},"参数“:空}}
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();
})();
第一次更新后,db中的文档为:
{
_id" : ObjectId("5af07316fc5f13c574ba825b"),
"field1" : "value1",
"lastModified" : ISODate("2018-09-07T23:18:21.485Z")
}
哪个是对的。我第二次尝试更新,它失败了。
我在用着:
"mongodb": "^3.1.4",
"node": "^10.10.0",
关于什么可能是错误的任何建议?
编辑:
第一次更新后,从数据库中取出数据,然后执行第二次更新。
解决方案
抛出错误是因为 $set 中的对象包含一个也将由 $currentDate 设置的属性。解决方案是确保 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 错误代码列表可在此处获得,但显然没有关于这些代码的描述或问题的官方文档(显然已在此提交中删除)。
这解决了这个问题。感谢@Greg 指出正确的方向。
推荐阅读
- java - 比较表示为链表的两个数字
- javascript - 为什么 .then() 根本不执行我的 Promise?
- python - SymPy 无法求解三角表达式,但 Matlab 可以
- android - 如何使用 contentResolver 在 Android Q 中访问下载文件夹中的内容
- drupal-7 - 嘿,有人可以通过使用 node_load() 加载节点来提供帮助
- spring-boot - 不同类型的JPA映射FK
- java - 如何设计底部导航栏,如自定义布局,中间有浮动按钮
- c++ - C++ 中的复合赋值
- ruby-on-rails - Rails 3.2 - ActiveRecord::RecordNotFound - 在数据库中找不到新创建的对象
- c# - 在 C# 列表框或文本框中显示 SQL Server 数据库表中的日期列值