我在 node 中使用"mongoose": "^5.7.1".js项目.我正在制作一个api,其中包括两个文档的更新.因此,我使用如下事务:

// Start the transaction
session = await mongoose.startSession()
session.startTransaction()

await Promise.all([
   <1st update operation>,
   <2nd update operation>
])

// Commit the transaction
session.commitTransaction()

当我在本地环境中使用此api时,出现以下错误:

MongoError:此MongoDB部署不支持可重试写入.请在连接字符串中添加retryWrites=false.

当我在远程环境中使用这个api时,它运行良好.我使用https://www.clever-cloud.com作为数据库云,AWS作为api云.

如错误消息中所述,我已try 输入retryWrites=false

  • 在我传递给mongoose作为mongodb://${ip}:${port}/${this.MONGO_DATABASE}?retryWrites=false的连接字符串的末尾
  • 将选项作为retryWrites: false传递给mongoose.connect方法.
mongoose.connect(`mongodb://${ip}:${port}/${this.MONGO_DATABASE}`, {
    useNewUrlParser: true,
    useUnifiedTopology: true,
    useCreateIndex: true,
    retryWrites: false
  }, (err) => {...})

以上这些都没有解决这个问题.

下面是mongo --version命令的输出:

db version v4.0.13
git version: bda366f0b0e432ca143bc41da54d8732bd8d03c0
allocator: system
modules: none
build environment:
    distarch: x86_64
    target_arch: x86_64

我进行了调试,发现抛出此错误背后的实际错误是:

MongoError:事务号只允许在副本集成员或mongos上使用

请提些建议.

推荐答案

事务无疑是MongoDB 4.0中最激动人心的新特性.但不幸的是,大多数安装和运行MongoDB的工具都会启动独立服务器,而不是复制集.如果试图在独立服务器上启动会话,将出现此错误.

在本地环境中使用replica-sets可以解决此问题.

为此我用了run-rs英镑.

Mongodb相关问答推荐

如何拉平mongo DB中的对象并在根目录中保存时有条件地重命名字段?

我们可以在Mongoose中这样使用Unique:[True,";This to Unique&qot;]吗

MongoDB与合并对象聚合

获取文档字段名并将其作为嵌套字段添加到聚合中

MongoDB 聚合 $match 阶段与条件查询

从具有多个数组匹配 MongoDB 的两个集合中采样数据

对 MongoDB 集合中的对象数组进行排序

MongoDB中的readPreference和readConcern有什么区别?

MongoDB 中 cursor.count() 和 cursor.size() 之间的区别

.NET 4 中是否有 mongodb C# 驱动程序支持 System.Dynamic.DynamicObject?

无法将 $match 运算符用于带有 ObjectId 的 mongodb/mongoose 聚合

如何在 $lookup Mongodb 的 LocalField 中将字符串转换为 objectId

Mongoose 是否真的验证了对象 ID 的存在?

如何在mongoose中加入两个集合

MongoDB 范围查询中 $lt 和 $gt 的顺序

MongoDB 在 mongoengine 中使用 OR 子句

如何在 Meteor 应用程序之间共享 MongoDB 集合?

如何在第一个文档中恢复 MongoDB ChangeStream 而不仅仅是在我开始收听后更改

在 MongoDB 中比较日期(moment.js)

MongoMapper 和迁移