使用 Mongoose 处理 MongoDB 中查找、修改、保存流程中的冲突

2024-01-03

我想更新一个涉及读取其他集合和复杂修改的文档,因此更新运算符findAndModify()不能达到我的目的。

这是我所拥有的:

Collection.findById(id, function (err, doc) {

    // read from other collection, validation
    // modify fields in doc according to user input
    // (with decent amount of logic)

    doc.save(function (err, doc) {
      if (err) {
        return res.json(500, { message: err });
      }

      return res.json(200, doc);
    });
}

我担心的是,如果多个客户端碰巧修改同一个文档,此流程可能会导致冲突。
据说here http://docs.mongodb.org/manual/tutorial/isolate-sequence-of-operations/ that:

对于 MongoDB 数据库,对单个文档的操作始终是原子的

我有点困惑什么Operations mean.

  • 这是否意味着findById()将获取锁直到doc超出范围(发送响应后),所以不会有冲突? (我不这么认为)
  • 如果没有,如何修改我的代码以支持多个客户端知道他们会修改 Collection?
  • 如果发生冲突,Mongoose 会报告吗?
  • How to handle the possible conflict? Is it possible to manually lock the Collection?
    • 我看到使用 Mongoose 的建议versionKey(或时间戳)并重试过时文档
    • 不要完全使用 MongoDB...

Thanks.


EDIT

感谢@jibsales的指点,我现在使用Mongoose的versionKey(时间戳也可以)以避免发生冲突。

aaronheckmann — Mongoose v3 第 1 部分 :: 版本控制 http://aaronheckmann.tumblr.com/post/48943525537/mongoose-v3-part-1-versioning

请参阅此示例代码:
https://gist.github.com/anonymous/9dc837b1ef2831c97fe8 https://gist.github.com/anonymous/9dc837b1ef2831c97fe8


操作指的是读/写。请记住,MongoDB 不是符合 ACID 的数据层,如果您需要真正的 ACID 合规性,那么最好选择其他技术。也就是说,您可以通过两阶段提交技术实现原子性和隔离MongoDB 文档中的这篇文章概述了 http://docs.mongodb.org/manual/tutorial/perform-two-phase-commits/。这不是一件小事,所以要做好承担一些繁重工作的准备,因为您需要使用本地驱动程序而不是 Mongoose。再说一遍,我的最终建议是,如果您需要事务支持(听起来您确实需要),则不要喝 NoSQL koolaid。

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

使用 Mongoose 处理 MongoDB 中查找、修改、保存流程中的冲突 的相关文章

  • 如何获取可用的猫鼬鉴别器列表?

    假设您有一个用户方案 您可以使用它来创建名为 用户 的基本模型 然后对于用户角色 您可以使用 mongoose 判别器来创建名为 Admin Employee 和 Client 的继承模型 有没有一种方法可以以编程方式确定用户模型有多少可用
  • Express/node.js 204 HTTP 代码响应问题

    这是我的代码 put function req res User findById req params user id function err user if err return res send err user dateEdite
  • 如何在 package.json 中对嵌套子模块和 TypeScript 使用“导出”?

    我想利用新的优势 出口 https nodejs org api packages html packages exportsNode js 的功能package json这样我就可以执行以下操作 exports dist index js
  • 如何验证 ObjectID

    使用 Joi 模式验证 是否可以针对 MongoDB ObjectID 进行验证 像这样的事情可能很棒 id Joi ObjectId required error errorParser 我发现如果我这样做 Joi object id J
  • 节点检查器显示对象“无属性”

    我在调试场景中相当陌生 尤其是节点检查器 安装节点检查器后 我使用 debug 参数启动了简单的节点应用程序 并且能够在 localhost 8080 debug port 5858 处看到调试视图 当我让应用程序在此断点处停止时 rout
  • 以html格式显示npm审计漏洞

    有没有办法将 npm 审计报告显示为 html 页面 目前我只能看到使用以下命令以 json 格式输出报告的选项 npm audit json 我写了一个NPM包 https www npmjs com package npm audit
  • 使用admin sdk在云函数中执行firestore集合组查询?

    firestore collectionGroup 方法在云函数中与 firebase admin sdk 一起使用时出现错误 是否可以在云函数中对 firestore 进行集合组查询 这是我尝试使用的 firestore 查询方法 htt
  • 将 html2pdf 生成的 pdf 发送回服务器

    我必须使用以下命令发送客户端生成的 PDFhtml2pdf到服务器 我已成功将生成的 PDF 转换为 base64 并希望使用axios 这是我的客户端代码 function myFunction var element document
  • 如何在 Jenkins 服务器上运行 Jest 测试

    我正在尝试运行我的Jest https facebook github io jest 在 Jenkins 部署期间进行测试 如果我 ssh 进入服务器 我可以 sudo 进入 Jenkins 用户并从工作区成功运行测试 但是 当我尝试从
  • Nodejs - 处理和发送多部分请求,

    我的应用程序在 Nodejs 服务器上运行 Node Js 还充当来自应用程序的请求的中间件 代理 因此 从浏览器开始 所有 REST 调用都会转到 NodeJs 然后转到 Java API 我发现处理多部分表单数据的请求时出现问题 我在
  • 我应该如何在http post请求的请求负载中传递json数据

    我想知道如何在有效负载中传递 json 请求 例如 name test value test var post data var post options host this host path path method POST heade
  • 如何检测和测量 Node.js 中的事件循环阻塞?

    我想监视 node js 中事件循环每次运行需要多长时间 但是我不确定衡量这一点的最佳方法 我能想到的最好的方法是这样的 var interval 500 var interval setInterval function var last
  • 如何使用 Web 套接字和 Angular CLI 设置代理

    我有一个使用 Angular CLI 构建的简单 Web 应用程序 我希望它使用网络套接字与后端通信 我已经编写了后端 并使用一个简单的 index html 页面进行了测试 服务器可以在套接字上发送和接收该页面 在我的 angular c
  • 如何使用 Nodejs 创建 Excel 文件?

    我是一名 Nodejs 程序员 现在我有一个数据表 我想将其保存为 Excel 文件格式 我该怎么做呢 我找到了一些 Node 库 但其中大多数是 Excel 解析器而不是 Excel 编写器 我使用的是 Linux 服务器 因此需要一些可
  • socket.io 作为客户端

    有什么方法可以将socketio作为客户端运行 不是浏览器 而是nodejs脚本 我需要将数据从服务器广播到一些客户端 浏览器 和另一台linux机器 仅运行nodejs来获取变量 没有浏览器 欢迎任何想法 Regards github上有
  • 如何使用 Karma 测试 NodeJS 后端代码(testaulous)

    如何设置 Karma 来运行我的后端单元测试 用 Mocha 编写 如果我将后端测试脚本添加到files 它未能说明require未定义 你不知道 Karma 仅用于测试基于浏览器的代码 如果您的项目在后端有 mocha 测试 在前端有 k
  • 获取对象数组中每个嵌套对象的虚拟属性?

    所以我知道如何获取单个虚拟属性 如 Mongoose 文档中所述 PersonSchema virtual name full get function return this name first this name last 但如果我的
  • 如何在Sequelize中设置查询超时?

    我想看看如何在 Sequelize 中设置查询的超时时间 我查看了 Sequelize 文档以获取一些信息 但我找不到我要找的东西 我发现的最接近的是 pools acquire 选项 但我不想设置传入连接的超时 而是设置正在进行的查询的超
  • 带有 npm 启动脚本的 Nodejs 应用程序

    我对nodejs很陌生 在我的docker化环境中 我想为nodejs应用程序提供appdynamics支持 这要求每个应用程序都要求将以下内容作为其应用程序的第一行 require appdynamics profile controll
  • "message": "ENOENT: 没有这样的文件或目录,打开 'E:\\astrology\\utils\\uploads\\1600798534862qf.png'"

    正如标题所示 我得到error message ENOENT no such file or directory open E astrology utils uploads 1600798534862qf png 在我的项目中 即使在通过

随机推荐

  • 在 Flutter 中实现推荐奖励

    我想在我的应用程序中建立一个推荐系统 以便用户可以通过电子邮件 电话号码等 以最简单的方式 邀请他们的朋友 当确认被邀请者安装了该应用程序时 它将奖励原始邀请比如说 发件人一个月没有横幅广告 我在网上能找到的唯一参考资料是这个 https
  • HttpMediaTypeNotAcceptableException:在异常处理程序中找不到可接受的表示

    我的控制器中有以下图像下载方法 Spring 4 1 RequestMapping value get image id fileName method RequestMethod GET public ResponseBody byte
  • Spring Boot 管理页面

    我试图了解如何在我的应用程序中使用 SBAP 因为它是一个非常方便的开发工具 我正在读他们的参考指南 http codecentric github io spring boot admin 1 3 2 getting started但我不
  • 如何使用 jQuery 或 CSS 自动调整(拉伸)div 高度和宽度

    我有 4 个 div id 为 A B C 和 D 如下所示 div div div div div div div div div div Div A 和 D 具有固定的宽度和高度 Div B 具有固定宽度 我想要自动计算 Div B 的
  • Pandas 过滤器计数

    我有一些数据按一秒间隔内的出现情况进行分组 我在寻找正确的方法来过滤掉低于特定阈值的计数时遇到问题 例如我不想显示计数低于 100 的任何内容 我尝试了各种版本的过滤器 lambda 构造 但我无法在调用 count 方法之前或之后进行过滤
  • 具有布尔值和多个参数的 python 多处理

    我有一个接受多个参数的函数 其中一些是布尔值 我正在尝试将其传递给多处理pool apply async并想要传递一些带有附加名称的参数 这是我正在使用的示例脚本 from multiprocessing import Pool def t
  • 如何将环境变量传递给docker-compose up

    我正在尝试运行一个容器 我已经将镜像上传到私有 Docker 注册表 我想编写一个撰写文件来下载和部署映像 但我想将标签名称作为变量从 docker compose run 命令传递 我的撰写文件如下所示 如何将 KB DB TAG VER
  • 是否可以升级 Angularjs 属性指令以在 Angular 4 中使用?

    我已经能够升级 AngularJS 元素指令以在 Angular 4 中使用 这是示例代码 myScores js angular module app components directives myScores directive my
  • PHP 上的无限循环的 Pthreads 与 Parallel

    我正在寻找一种在 PHP 上执行多线程的方法 并遇到了 pthreads PHP API 我认为它很容易实现 但是我必须找出如何安装支持 Debian 的 ZTS 的 PHP 版本 问题是 当我查看 pthreads php net 文档时
  • 查找8086微处理器中的物理地址

    在8086微处理器中 20位地址分为16位 4位地址 其中4位二进制是段地址 当我们将4位二进制转换为十六进制时 它会变成1位十六进制 我的问题是当我们遇到计算物理地址的问题时从逻辑地址上看 给出的是一个4bit的十六进制段地址 为什么会这
  • 如何验证 Perl 中的函数参数?

    你能告诉我 Perl 中验证函数参数最明智的方法是什么吗 代码片段 sub testfunction my args my value args gt value die no value set process value testfun
  • Redux 和 React Router:结合调度和导航 (history.push)

    我对如何使用 React Router 有点一无所知history push route with Redux 换句话说 如果你将一个组件与 Redux 的连接mapDispatchToProps 你怎么放history push rout
  • 为什么 Flowable 不是 Observable

    为什么 Flowable 不是 Observable Observable 接口几乎是 Flowable 的子集 它们的实现几乎相同 为什么他们不实现一个通用接口 以便我们可以直接将 Flowable 转换为 Observable 为什么
  • 正则表达式匹配由任何字符分组包围的可选组

    我正在尝试匹配一个可选组 该组前面和后面可以有任意数量的字符 整个模式也有必需的开始和结束匹配 但中间的匹配是可选的 我从这个开始 当需要中间组时它有效 string text blah blah foo This is a test bl
  • Python Google Drive API - 获取“我的云端硬盘”文件夹的 ID

    在 Python 3 中使用 Drive API 我正在尝试编写一个脚本来下载整个用户的 Google Drive 此代码来自 Drive API V3 文档 经过修改以搜索文件夹而不是文件 将获取用户拥有所有权的每个文件夹 包括团队驱动器
  • 如何在 JSDoc 中将参数标记为包含 DOM 节点?

    我想指示参数应该是 DOM 节点 但我似乎找不到任何有关如何使用 JSDoc 指示这一点的信息 我可以用 Object 但这相当难看 我宁愿有类似的东西 Node or DOMNode 但我找不到任何例子来指出我的方向 那么 如何将参数标记
  • BlueZ 在 DBUS 上显示旧的缓存数据

    我对 BlueZ 有一个非常奇怪的问题 Ubuntu 16 04 中的库存版本 5 37 我正在开发蓝牙外围设备 我只有一套开发套件 在其固件中 我更改了广播的名称 当我使用时 hcitool lescan 显示我的设备的更新名称 但是当我
  • 使用 Collections API 进行随机播放

    我感到非常沮丧 因为我似乎无法弄清楚为什么集合洗牌无法正常工作 可以说我正在尝试洗牌randomizer大批 int randomizer new int 200 300 212 111 6 2332 Collections shuffle
  • 在 PhoneGap+jQuery Mobile 中使用 ajax 的 CORS 无法在设备上运行,但可以在浏览器上运行

    因此 我正在使用 Phone Gap 和 jQuery mobile 构建一个应用程序 当使用 ajax 从白名单服务器获取 json 响应时 我收到错误响应 但是控制台中没有显示任何内容 奇怪的是 当在网络浏览器中测试该应用程序时 它工作
  • 使用 Mongoose 处理 MongoDB 中查找、修改、保存流程中的冲突

    我想更新一个涉及读取其他集合和复杂修改的文档 因此更新运算符findAndModify 不能达到我的目的 这是我所拥有的 Collection findById id function err doc read from other col