DBA MongoDB 开发指南
工具大全
以下是MongoDB中常用的工具:
软件模块 | 描述 |
---|---|
mongod | MongoDB数据库软件 |
mongo | MongoDB命令行工具,管理MongoDB数据库 |
mongos | MongoDB路由进程,分片环境下使用 |
mongodump / mongorestore | 命令行数据库备份与恢复工具 |
mongoexport / mongoimport | 命令行CSV/JSON导入与导出,用于异构平台迁徙 |
MongoDB Compass | MongoDB的GUI管理工具 |
Ops Manager(企业版) | MongoDB的集群管理软件 |
BI Connector(企业版) | SQL解释器 / BI套件 |
MongoDB Charts(企业版) | MongoDB可视化软件 |
Atlas(付费及免费) | MongoDB云托管服务,赠送免费永久的基础复制集群 |
现在你可以下载的软件有:Compass
也可以尝试在Atlas上注册,获取免费的基础复制集群,全称自动不必手动搭建
链接方式
各个主流编程语言中都有MongoDB的官方驱动,可用于与MongoDB服务进行链接。
在进行链接时,会生成一个链接对象MongoClient,在代码中使用MongoClient时一定要保证它是单例的,并且整个生命周期中都能从它获取其他操作对象。
你可以通过链接字符串进行链接,链接字符串中可以配置大部分的链接选项,建议将常见选项在此进行配置。
参数 | 描述 |
---|---|
maxPoolSize | 链接池大小,默认为100 |
Max Wait Time | 最大等待时间(毫秒) |
Write Concern | 写入策略,建议设置majority |
Read Concern | 读取策略,建议设置majority,按场景选择 |
Read Preference | 读取节点,按场景选择 |
auth Source | 验证库 |
复制集链接
使用复制集进行链接时,需要指定所有节点,在发生故障转移后自动切换:
mongodb://用户名:密码@主库地址:端口,从库地址:端口,从库地址:端口/?authSource=验证库&replicaSet=复制集名称&w=majority&wtimeoutMS=5000&readConcernLevel=majority&readPreference=secondary
需要注意的是,如果你的复制集中没有使用ip而是使用hostname进行配置,则链接时也要指定hostname,如下所示(由于没有加认证,所以没使用用户名和密码以及认证库的参数):
mongodb://centos:27017,centos:27018,centos:27019/?replicaSet=rs0&w=majority&wTimeoutMS=5000&readConcernLevel=majority&readPreference=secondary
同时你的物理机上也要配置hosts文件,加入复制集的hostname。
# Host Database
# localhost is used to configure the loopback interface
# when the system is booting. Do not change this entry.
192.168.1.120 centos
嗯..我这里用MongoDB Compass链接后的情况如下:
分片集链接
如果是要链接一个分片集,则只需要链接mongos即可:
mongodb://mongos1,mongos2,mongos3.../database?[options]
mongodb+srv
在配置集群时使用域名可以为集群变更时提供一层额外的保护。
例如,需要将整体集群迁移到新文段,则在应用程序的计算机上直接修改hosts文件即可。
MongoDB在3.6版本后提供了mongodb+srv://的协议,该协议允许通过域名解析得到所有mongs或节点的地址,而不是写在链接字符串中:
mongodb+srv://server.example.com/
了解更多
如果你想了解更多关于链接MongoDB的方式,可查阅官方文档:
点我跳转
查询相关
注意事项
使用查询时,注意以下三点:
每个查询尽量有对应的索引
尽量使用覆盖索引
使用投影来减少返回到客户端的文档内容,如聚合操作中的$project,普通查询中的find()第二参数
分页处理
处理分页时,不要使用find()函数直接查询出所有数据然后再根据limit()和skip()进行分页,而是应该采用查询唯一条件+唯一排序条件,最好是聚集索引,如下所示:
db.collection.find().sort({_id : 1}).limit(20) # 不好
db.collection.find({_id : {$lte : <第1页最后一个_id>}}).sort({_id : 1}) # 好
db.collection.find({_id : {$lte : <第2页最后一个_id>}}).sort({_id : 1}) # 好
...
写入相关
注意事项
使用写入操作时,注意以下三点:
在update()语句中只包括需要更新的字段,加$set修改器,而不是替换全文档
尽可能使用批量插入来提升写入性能,如insertMany()
使用TTL索引来管理自动过期的文档,如日志类型文档
文档结构
防止使用太长的字段名(浪费空间)
防止使用太深的嵌套(阅读与操作都复杂)
不要使用中文,标点符号以及非拉丁字母作为字段名