数组中的 MongoDB 更新失败:更新路径“companies.$.updatedAt”会在“companies.$”处产生冲突

2023-11-26

我们(从 MongoDB 3.4)升级到:

MongoDB:4.2.8

猫鼬:5.9.10

现在我们收到了这些错误。对于最小的例子,模型是:

[公司.js]

'use strict';

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

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

and [目标组.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});
  }

(这确实有效),但我想了解这个问题,并且我们的项目中还有更大的模型也存在同样的问题。

这是一个问题吗{时间戳: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;
    }
  }

这在每次更新/插入时运行。正如你所看到的,它设置了updatedAt and createdAt数组中每个对象的含义意味着更新对象从以下位置更改:

{$set: {'companies.$.name': company.name}}

To:

{
  "$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 and $unset同一更新中的同一字段 Mongo 不执行任何操作,因此会引发错误。

在你的情况下,它的发生是由于companies.$.updatedAt场地。因为您正在更新整个对象companies.$,这意味着您基本上将其设置为{name: "Test 2"}这也意味着您正在“删除”updatedAt字段(以及其他),而猫鼬试图将其设置为它自己的值,从而导致错误。这也是您更改为的原因companies.$.name工作原理就像你只需要设置name字段而不是整个对象,因此不会产生冲突。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数组中的 MongoDB 更新失败:更新路径“companies.$.updatedAt”会在“companies.$”处产生冲突 的相关文章

  • 如何使用 mongo-cxx-driver 设置 Visual Studio 项目设置?

    我已经在 Windows 10 上成功构建了用于 C 的 MongoDB 驱动程序版本 3 0 3 CMAKE INSTALL PREFIX C mongo cxx driver 但我不知道如何在 Visual Studio 2015 中设
  • 当使用带 _id 的复合分片键时,MongoDB 是否确保唯一的 _id 字段值

    我想启动分片 如您所知 分片键非常重要 我发现 使用 id 以外的分片键时 MongoDB 不确保 id 字段值唯一 http docs mongodb org manual faq sharding how does mongodb en
  • 猫鼬模式创建

    我刚刚开始使用猫鼬 我有一个使用 mongoose 的创建脚本 它使用示例数据创建模式和数据库 现在我编写实际的应用程序 我是否需要在每次应用程序运行时创建架构对象 或者它是否已经以某种方式可用 换句话说 我是否需要在每个使用 mongoo
  • MongoDb聚合

    如何使用 mongoDb 聚合编写模拟查询 select count as ccount from a group by a someField order by ccount desc limit 1 使用 mongoDb 中的 grou
  • 如何在 mongodb 查询中过滤数组

    在 mongodb 中 我有一个包含单个文档的集合 如下所示 id ObjectId 5552b7fd9e8c7572e36e39df StackSummaries StackId arn aws cloudformation ap sou
  • 使用 MongoDB 和 ASP.NET MVC 进行分页的有效方法

    我们正在创建一个应用程序 MongoDB 作为数据库 我们正在使用MongoDB 的官方 C 驱动程序 http docs mongodb org ecosystem drivers csharp 我们有一个包含数千条记录的集合 我们想要创
  • Mongodb聚合,如何按间隔标准对文档进行计数?

    我的 MongoDB 文档如下所示 StatCode LoadTime 例如 数据可能如下所示 id StatCode LoadTime 1 200 0 345 2 200 0 234 3 200 0 396 4 200 1 234 5 2
  • 我可以通过mongo shell重启mongodb服务器吗?

    我可以通过 mongo CLI 客户端重新启动 MongoDB 服务器吗 您无法从客户端停止和启动 重新启动 它 正如 i kimiko 已经提到的 你可以在客户端上关闭它db shutdownServer 通过 mongo shell数据
  • 使用mongodb聚合框架按数组长度分组

    我有一个看起来像这样的集合 id id0 name saved things id id1 name saved things id id2 name saved things etc 我想使用 mongodb 的聚合框架来得出一个直方图结
  • Mongo JSON 文档 -> JSON -> BSON

    我正在使用 Node js 构建一个使用 mongodb 的 Web 套接字服务器 我使用 node mongodb native 作为访问 mongodb 的库 当我对数据库中的对象调用 console log sys inspect i
  • 如何决定使用哪种NoSQL技术? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 MongoDB 基于文档 HBase 基于列 和 Neo4j 对象图 的优缺点是什么 我特别有兴趣了解
  • mongodb在windows下无法启动?

    当我尝试在命令行上使用命令 mongod exe 启动 mongodb 时 它会抛出以下错误 C mongodb win32 x86 64 2 0 6 bin gt mongod exe mongod exe help for help a
  • 聚合和展开数组,但保留顶级键

    假设我的收藏中有以下文档Classes收藏家 id ObjectId 5df58d45244a850d54b922c8 mentors numOfMentors NumberInt 1 mentorList ObjectId 5c9ba63
  • Mongoose嵌入式文档更新

    我在嵌入式文档更新方面遇到问题 我定义的架构 var Talk new Schema title type String required true content type String required true date type D
  • Mongodb 通过查询和分组查找

    简单收集 id 123 name FooBar zone Bas id 456 name Alice zone Bas id 789 name FooBar zone Bas 首先 我构建一个查询来按名称查找所有元素 db collecti
  • Mongoose 模型 update() 与 save()

    有一个关于问题update vs save https stackoverflow com questions 39010045 mongoose update vs save 但它针对的是一些不同的东西 我猜 纯粹相关mongoose S
  • 如何验证 ObjectID

    使用 Joi 模式验证 是否可以针对 MongoDB ObjectID 进行验证 像这样的事情可能很棒 id Joi ObjectId required error errorParser 我发现如果我这样做 Joi object id J
  • 使用 Spring Data MongoDB 查询纯 BSON

    是否可以在 Spring Data MongoDB 中查询纯 JSON BSON 数据 而无需将数据转换为实际的模型实现 我能找到的只是 MongoOperation 的
  • MongoDB自增ID

    MongodB 中自动生成的 ID 的大小为12 Bytes大整数的大小是8 bytes 我在 4 台运行 Ubuntu Server 的机器上有一个 mongodb 集群 但我现在只是在测试 插入只能通过一台服务器 即 Nodejs 服务
  • Mongodb 聚合数组中的子文档

    我正在使用 mongodb 作为后端实现一个小型应用程序 在此应用程序中 我有一个数据结构 其中文档将包含一个包含子文档数组的字段 我使用以下用例作为基础 http docs mongodb org manual use cases inv

随机推荐