У меня есть следующая схема:
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 я могу запустить db.answers.find().pretty(), и это дает мне:
{
"_id" : ObjectId("5fe656077ddb2a4e1a91d808"),
"username" : "aaaa",
"__v" : 0
}
Однако, когда я использую POSTMAN для доступа к URL-адресу «/ test», я получаю сообщение об ошибке «Повторная запись не поддерживается». Я знаю, что documentdb не поддерживает повторную запись, но как FindOneAndUpdate требует повторной записи? Я также пытался использовать set() и save() с findOne(), и findOne() работает нормально, но set() выдает ту же ошибку. Я что-то пропустил здесь?
да, но сама documentdb не поддерживает повторную запись, так что это не работает. Почему для обновления требуется повторная запись?
Повторная запись предназначена для обработки случаев, когда во время операции записи возникает сетевая ошибка. Вы получите эту ошибку для любой из операций записи, перечисленных здесь, включая save
и findOneAndUpdate
, как вы испытали сами.
Документация DocumentDB о функциональных различиях с MongoDB включает раздел о повторных попытках записи, где рекомендуется установить 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).
Я нашел похожий вопрос здесь, ваша строка подключения содержит
?retryWrites=true
?