【问题标题】:Mongoose findOneAndUpdate throw "Retryable writes are not supported" error when working with aws Documentdb使用 aws Documentdb 时,Mongoose findOneAndUpdate 抛出“不支持可重试写入”错误
【发布时间】:2020-12-26 03:12:38
【问题描述】:

我的架构如下:

var answerSchema = new mongoose.Schema({
  username: {
    type: String,
    unique: true,
    required: true
  }
)
mongoose.model("Answer", answerSchema)

在另一个文件中我有:

var Answer = mongoose.model("Answer")
router.put("/test", function (req, res){
  const query = { _id: "5fe656077ddb2a4e1a91d808"}
  const update = { username: 'test' }
  const options = {
    new: true,
    upsert: true,
    setDefaultsOnInsert: true
  }
  
  Answer.findOneAndUpdate(query, update, options, function(error, doc) {
      if(error){
        res.send(error.message)
      }
      else{
        res.send('successfully saved.')
      }
    })
})

目前在 mongo shell 中,我可以运行 db.answers.find().pretty() 它给了我:

{
        "_id" : ObjectId("5fe656077ddb2a4e1a91d808"),
        "username" : "aaaa",
        "__v" : 0
}

但是,当我使用 POSTMAN 访问“/test” URL 时,我收到错误消息“不支持可重试写入”。我知道 documentdb 不支持可重试写入,但是这个 FindOneAndUpdate 如何需要可重试写入?我还尝试将 set() 和 save() 与 findOne() 一起使用,并且 findOne() 工作正常,但 set() 会引发相同的错误。我错过了什么吗?

【问题讨论】:

  • 我发现了一个类似的问题here,你的连接字符串是否包含?retryWrites=true
  • 是的,但是 documentdb 本身不支持可重试写入,所以这不起作用。为什么更新需要可重试的写入?

标签: node.js mongodb mongoose aws-documentdb


【解决方案1】:

Retryable Writes 用于处理写入操作期间出现网络错误的情况。您会在here 列出的任何写入操作中遇到此错误,包括savefindOneAndUpdate,正如您亲身经历的那样。

关于其与 MongoDB 的功能差异的 DocumentDB 文档包括 a section on retryable writes,其中建议在连接字符串中设置 retryWrites=false 以避免这些类型的错误:

从兼容 MongoDB 4.2 的驱动程序开始,默认启用可重试写入。但是,Amazon DocumentDB 目前不支持可重试写入。功能差异将在类似于以下内容的错误消息中体现出来。

{"ok":0,"errmsg":"Unrecognized field: 'txnNumber'","code":9,"name":"MongoError"} 

可通过连接字符串(例如,MongoClient("mongodb://my.mongodb.cluster/db?retryWrites=false")) 或 MongoClient 构造函数的关键字参数(例如,MongoClient("mongodb://my.mongodb.cluster/db", retryWrites=False)))禁用可重试写入。

【讨论】:

  • 这也拯救了我的一天!埃琳娜感谢您提出这个问题!有趣的是,我在 insertOne 上没有收到错误(只是 replaceOne)。
猜你喜欢
  • 2022-01-12
  • 2022-12-12
  • 2021-02-06
  • 2022-08-21
  • 2021-09-12
  • 2022-10-13
  • 1970-01-01
  • 2018-02-19
  • 2021-02-21
相关资源
最近更新 更多