MongoError: Это развертывание MongoDB не поддерживает повторяющиеся записи. Пожалуйста, добавьте retryWrites = false в строку подключения

10

Я использую "mongoose": "^5.7.1"в своем проекте Node.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.

Как написано в сообщении об ошибке, я попытался поставить retryWrites=false

  • в конце строки подключения, которую я передаю в мангуст, как 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

Пожалуйста, предложите что-нибудь.

Andro Developer
источник
Я тоже начал видеть эти ошибки. Я использую Mlab на Heroku. Но добавление опции на клиенте решило эту проблему. Я только что попробовал версию URI, и она работает также. Странный.
Миг
Я использую автономный сервер, и это вызывает эту ошибку. Первоначальная ошибка не была фактической, а более позднюю можно устранить с помощью набора реплик или общих кластеров. См. Npmjs.com/package/run-rs
Andro Developer,

Ответы:

2

Транзакции, несомненно, являются самой интересной новой функцией в MongoDB 4.0. Но, к сожалению, большинство инструментов для установки и запуска MongoDB запускают автономный сервер, а не набор реплик. Если вы попытаетесь запустить сеанс на автономном сервере, вы получите эту ошибку.

Эта проблема может быть решена с помощью наборов реплик в вашей локальной среде.

Я использовал run-rs для этой цели.

Andro Developer
источник
2

Как указано в принятом ответе, вам нужно, чтобы ваш локальный сервер работал как набор реплик, чтобы иметь возможность выполнять транзакции, в отличие от автономного сервера.

Однако, в дополнение к предлагаемому решению, вы можете легко преобразовать свою автономную локальную базу данных в набор реплик без использования стороннего инструмента , следуя инструкциям в документации MongoDB , обобщенно изложенной следующим образом:

  1. Остановите свой автономный экземпляр mongod и перезапустите его с replSetаргументом.
mongod --port 27017 --dbpath /srv/mongodb/db0 --replSet rs0 --bind_ip localhost
  1. Подключитесь к своему экземпляру с помощью mongoоболочки и запустите новый набор реплик.
rs.initiate()

Теперь у вас должен быть набор реплик вместо автономного сервера mongodb, где вы можете выполнять транзакции в своей локальной среде для обновления нескольких документов одновременно!

Не забывайте включать replSetаргумент каждый раз, когда вы хотите запустить сервер, иначе он будет запущен как автономный. Я просто использую ту же команду, что и на шаге 1, чтобы запустить ее снова.


Кроме того, вы можете развернуть новый набор реплик с нуля для тестирования среды, следуя этим другим инструкциям в документации MongoDB.

gasbi
источник
0

Пожалуйста, отредактируйте App/Config/databaseфайл Добавить 'retryWrites'=>falseв строку подключения Mongodb

написать монго дб соединение

'mongodb' => [
            'driver'   => 'mongodb',
            'host'     => env('MONGO_DB_HOST', 'lo*****'),
            'port'     => *****,
            'database' => env('MONGO_DB_DATABASE'),
            'username' => env('MONGO_DB_USERNAME'),
            'password' => env('MONGO_DB_PASSWORD'),
            'options'  => [
                'database'=> env('MONGO_DB_DATABASE'),
                'retryWrites'=>false
            ]
        ],

Сохранить и запустить

Arshit
источник
0

Пожалуйста, попробуйте добавить &retryWrites=falseв строку подключения

-

Я на самом деле получил ошибки, упомянутые в OP при подключении к нашему удаленному серверу БД, тогда как он работал локально. Я связался с нашей службой поддержки в Монго, прежде чем пытаться предположить, что это ошибка.

-

Вот что сказал наш хостинг-сайт монго (mLab):

Вероятно, драйвер вашего приложения был обновлен до более поздней версии, которая пытается использовать функцию только для WiredTiger. Как упоминается в сообщении об ошибке, вам нужно добавить & retryWrites = false в строку подключения.

https://docs.mlab.com/faq/#why-am-i-getting-the-transaction-numbers-are-only-allowed-on-storage-engines-that-support-document-level-locking-error

крис
источник