我看的是http://mongodb.github.io/node-mongodb-native/driver-articles/mongoclient.html,当你滚动到"A replicaset connect using no Acknowledge by default and readPreference for secondary"一节时

它向副本集声明了一个连接字符串,如下所示:

MongoClient.connect("mongodb://localhost:30000,localhost:30001/integration_test_?w=0&readPreference=secondary", function(err, db) {

}

我不明白为什么我们需要指定2 hosts.我认为MongoDB文档已经声明副本集对客户端是透明的.这意味着,客户端只需要连接到主副本集,MongoDB就可以完成这项工作.因此,连接应该只包含一个主机.MongoDB doc声明副本集中必须至少有3 hosts个,而这个连接字符串只指定了2 hosts个.

此外,为什么连接字符串没有声明"复制集"?

推荐答案

连接字符串中的多个服务器用作发现连接模式的种子列表.你是对的,你只需要指定主服务器,一切都会很好地工作.That is, until the primary server goes down or is very busy.通过在连接字符串中指定多台机器,可以为客户端提供多个位置来查询副本集配置.

当连接模式解析为副本集时(请参阅下文),驱动程序将找到主服务器,即使它不在种子列表中,只要种子列表中至少有一个服务器响应(响应将包含完整的副本集和当前主服务器的名称).此外,即使在初始连接之后,也会自动发现并添加(或删除)其他辅助项.这将使您能够从副本集中添加和删除服务器,驱动程序将自动处理更改.

为了回答您的最后一个问题,因为指定多个服务器对于它是副本集还是多个mongos(在分片设置中)是不明确的,所以驱动程序将通过连接到服务器的发现阶段来确定它们的类型.这在连接时有一点开销,可以通过在连接字符串中指定连接模式来避免,因此使用replicaSet关键字.因此,虽然这不是必需的,但它可以加快连接时间,以便在连接字符串中显式地声明服务器位于副本集中.

Mongodb相关问答推荐

MongoDB 4.4如何使用未知密钥更新dict

MongoDB v4.4聚合的$getfield替代方案

为什么 mongoose 在 mongodb 中找不到我的数据

Golang中的Mongo中值运算

使用 mongo-driver/mongo 使用键/值对中的值表达式查找文档

如何过滤查找mongodb的结果

Mongo:投影不影响布尔值

mongoDB vs mySQL - 为什么在某些方面比另一个更好

使用 mongodb 时是否需要规范化数据库?

增加嵌套对象中的值?

Mongo查询子文档的多个字段

Mongoexport 在日期范围内使用 $gt 和 $lt 约束

MongoDB获取聚合查询的executionStats

mongodb中类型不相等的查询

ZonedDateTime 与 MongoDB

如何在 Mongoose 中更新数组值

查询 Mongoid/rails 3 中的嵌入对象(Lower than、Min 运算符和排序)

mongoose:按字母顺序排序

MongoDB备份计划

无法在 mac os 10.9 上安装 mongodb php 驱动程序