我已经安装MongoDB v4.0
来实现其最神奇的功能,它以mongodb
3.1作为驱动程序在Node.js中提供了 Transaction 。
当我尝试使用交易会话时,遇到了此错误:
MongoError:事务编号仅允许用于副本集成员或mongos。
那是什么,我如何摆脱它?
任何建议都值得赞赏。
答案 0 :(得分:5)
Transactions
无疑是MongoDB 4.0
中最令人兴奋的新功能。但是不幸的是,大多数用于安装和运行MongoDB的工具都启动了独立服务器,而不是副本集。如果您尝试在独立服务器上启动会话,则会收到此错误。
为了使用事务,您需要一个 MongoDB 副本集,并且在本地启动副本集进行开发是一个涉及的过程。新的run-rs npm module
使启动副本集变得容易。启动副本集只需运行run-rs,run-rs甚至会为您安装正确版本的MongoDB。
Run-rs除Node.js和npm外没有其他依赖项。您不需要安装Docker,自制软件,APT,Python甚至MongoDB。
使用npm's -g
标志在全局安装run-rs。您还可以在package.json
文件的devDependencies中列出运行库。
npm install run-rs -g
接下来,使用--version标志运行run-rs。 Run-rs将为您下载MongoDB v4.0.0。不用担心,它不会覆盖您现有的MongoDB安装。
run-rs -v 4.0.0 --shell
然后在连接字符串中使用 replicaSet=rs
。
您可以找到有关here的更多详细信息。
答案 1 :(得分:2)
我最近遇到了同样的问题。就我而言,这是因为我要连接到与本地开发环境版本不同的远程Mongo服务器。
为了快速解决此问题,我在连接字符串中添加了以下参数:
? retryWrites = false
答案 2 :(得分:2)
我得到了解决方案,它只是 MongoDB 配置文件中的三行配置。
从 MongoDB atlas 切换并使用 WHM 在 CentOS 7 VPS 上安装 MongoDB v 4.4.0 后,我也遇到了这个问题。
run-rs
解决方案对我不起作用,但我设法在没有任何第三方工具的情况下解决了这个问题,具体步骤如下:
mongod
。最有效的方法是使用命令 mongo
进入 MongoDB shell
签出方法
db.shutdownServer()
您将无法使用 MongoDB 服务器。 对我来说,关机过程耗时太长,然后我用命令杀掉了进程:
systemctl stop -f mongod
如果你杀死了 mongod
进程,你可能需要运行
mongod --dbpath /var/db --repair
var/db
应该指向您的数据库目录。
对于 replicaSet 设置步骤,请查看 /etc/mongod.conf
文件,
查找 replication
值行,您应该添加以下几行:
replication:
oplogSizeMB: <int>
replSetName: <string>
enableMajorityReadConcern: <boolean>
在下一步中使用 replSetName
值。
将 replSetName 的值添加到您的连接 URL &replicaSet=--YourReplicationSetName--
输入命令:systemctl start mongod
使用命令mongo
进入MongoDB shell,输入命令rs.initiate()
现在你应该在你的 replicaSet 数据库中。
答案 3 :(得分:0)
我一直在与这个问题作斗争几周。我让你我的结论。 为了能够在分片群集上使用事务,您至少需要在群集上运行MongoDB 4.2。如果群集未分片,则从4.0开始。 我使用的库具有作为子依赖项的mongodb NodeJS驱动程序。来自版本3.3.x的该驱动程序无法对具有版本4.0.4的分片MongoDB群集进行故障处理。 对我来说,解决方案是将群集更新为4.2版本。
答案 4 :(得分:0)
要使用事务,您需要一个MongoDB副本集,并且在本地启动副本集进行开发是一个复杂的过程。
您可以使用run-rs npm module
。零配置MongoDB运行程序。启动一个没有非节点依赖性的副本集,甚至没有MongoDB。
或者您可以简单地在MongoDB Atlas
中创建一个帐户,该帐户为您提供了有限的资源MongoDB集群,因此您可以运行/测试您的应用程序。
答案 5 :(得分:0)
使用 docker
进行本地开发的可能解决方案创建 Dockerfile
FROM mongo:4.4.7
RUN echo "rs.initiate();" > /docker-entrypoint-initdb.d/replica-init.js
CMD [ "--replSet", "rs" ]
构建这个 Dockerfile
docker build ./ -t mongodb:4.7-replset
运行这个创建的图像
docker run --name mongodb-replset -p 27017:27017 -d mongodb:4.7-replset
使用此 URI 连接到数据库
mongodb://localhost:27017/myDB