gpt4 book ai didi

数组中的 MongoDB 更新失败 : Updating the path 'companies.$.updatedAt' would create a conflict at 'companies.$'

转载 作者:行者123 更新时间:2023-12-04 08:53:03 31 4
gpt4 key购买 nike

我们升级(从 MongoDB 3.4)到:
MongoDB:4.2.8
Mongoose :5.9.10
现在我们收到了这些错误。对于最小的例子,模型是:
[company.js]

'use strict';

const Schema = require('mongoose').Schema;

module.exports = new Schema({
name: {type: String, required: true},
}, {timestamps: true});


[target_group.js]
'use strict';

const Schema = require('mongoose').Schema;

module.exports = new Schema({
title: {
type: String,
required: true,
index: true,
},
minAge: Number,
maxAge: Number,
companies: [Company],
}, {timestamps: true});

当我尝试在目标群体中更新公司时
  _updateTargetGroup(companyId, company) {
return this.targetGroup.update(
{'companies._id': companyId},
{$set: {'companies.$': company}},
{multi: true});
}
我收到
MongoError:更新路径 'companies.$.updatedAt' 会在 'companies.$' 产生冲突
即使我预先
    delete company.updatedAt;
delete company.createdAt;
我收到这个错误。
如果我尝试类似的数据库工具(Robo3T),一切正常:
db.getCollection('targetgroups').update(
{'companies.name': "Test 1"},
{$set: {'companies.$': {name: "Test 2"}}},
{multi: true});
当然我可以使用解决方法
  _updateTargetGroup(companyId, company) {
return this.targetGroup.update(
{'companies._id': companyId},
{$set: {'companies.$.name': company.name}},
{multi: true});
}
(这确实有效),但我想了解这个问题,我们在项目中还有更大的模型,但也有同样的问题。
这是 {timestamps: true} 的问题吗?我搜索了一个解释,但找不到任何东西...... :-(

最佳答案

该问题源于使用 timestamps正如您所提到的,但我不会称其为“错误”,因为在这种情况下,我可以争辩说它按预期工作。
首先让我们了解一下使用timestamps在代码中执行,这里是 mongoose 对带有时间戳的数组( company 数组)所做的代码示例:( source )

  for (let i = 0; i < len; ++i) {
if (updatedAt != null) {
arr[i][updatedAt] = now;
}
if (createdAt != null) {
arr[i][createdAt] = now;
}
}
这在每次更新/插入时运行。如您所见,它设置了 updatedAtcreatedAt数组中的每个对象意味着更新对象从:
{$set: {'companies.$.name': company.name}}
到:
{
"$set": {
"companies.$": company.name,
"updatedAt": "2020-09-22T06:02:11.228Z", //now
"companies.$.updatedAt": "2020-09-22T06:02:11.228Z" //now
},
"$setOnInsert": {
"createdAt": "2020-09-22T06:02:11.228Z" //now
}
}
现在,当您尝试使用两个不同的值/操作更新同一字段时会发生错误,例如,如果您要 $set$unset同一个更新中的同一个字段 Mongo 不做什么,因此它抛出错误。
在您的情况下,这是由于 companies.$.updatedAt field 。因为您在 companies.$ 处更新整个对象,这意味着您基本上将其设置为 {name: "Test 2"}这也意味着您正在“删除” updatedAt字段(除其他外),而 Mongoose 试图将其设置为它自己的值,从而导致错误。这也是您更改为 companies.$.name 的原因就像您只设置 name 一样工作字段而不是整个对象,因此不会产生冲突。

关于数组中的 MongoDB 更新失败 : Updating the path 'companies.$.updatedAt' would create a conflict at 'companies.$' ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63994447/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com