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链接后的情况如下:

image-20210317215444123

分片集链接

​ 如果是要链接一个分片集,则只需要链接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索引来管理自动过期的文档,如日志类型文档

文档结构

​ 防止使用太长的字段名(浪费空间)

​ 防止使用太深的嵌套(阅读与操作都复杂)

​ 不要使用中文,标点符号以及非拉丁字母作为字段名

posted @ 2021-03-17 22:21  云崖君  阅读(139)  评论(0编辑  收藏  举报