0

MongoDB服务默认是无认证模式

新建的MongoDB服务是无认证模式,即不需要用户名和密码就可以登录数据库。在有更好的认证方式(LDAP)前,用户名/密码是基本的认证方式。保持MongoDB服务的更新,并持续关注日志中是否有未经授权访问的迹象。

减少MongoDB的被攻击面

MongoDB的安全检查表为降低网络渗透和数据泄露提供了很好的建议。在没有必须的理由时,最好在配置文件中禁用javascript的使用。由于MongoDB的数据文件为加密,最好用专用用户来运行MongoDB。

架构设计

这篇文章值得一读<6 Rules of Thumb for MongoDB Schema Design>.

忘记排序规则

MongoDB默认使用二进制排序。当你创建一个MongoDB库默认使用不区分大小写的排序规则。选择适合系统用户的语言文化,将使查询字符串数据非常容易。

创建大文档的集合

文档中可以包含数组,但最好保持数据数量在4位数以下。如果数据被添加的很频繁,它将超出分配给文档的空间,因此必须移动文档位置,更新每个索引。

MongoDB有一个填充因子可以给文档提供增长的空间,来避免此问题。

也许你认为可以不给数组字段建立索引来规避这个问题,但没有索引将会遇到其它问题。例如由于从头到尾扫描文档因此在数据末尾查找元素花费的时间更长,处理此类文档的大多数操作都很慢。

快速写入

不要使用writeconcern为0的快速写入,种方式下如果数据在写入磁盘之前出现系统崩溃,数据将丢失且处于不一致状态。
MMAPv1和WiredTiger存储引擎都使用了journal来防止这种情况,如果journal关闭,在恢复过程中WiredTiger将恢复到最后一个一致检查点。

日志写入之间的持续时间可以使用commitIntervalMs配置

无索引排序

在查询过程中通常都需要对数据排序,我们往往希望在查询的最后一个阶段来完成这个操作以减少排序的数据量。尽管如此你仍然需要一个索引来替代排序,简单索引和复合索引都可以。
如果没有合适的索引,MongoDB将会排序,排序操作中所有文档的总大小都32M内存限制,如果到达该限制,它将产生错误或偶尔返回空记录集。

hash对象中键的顺序很重要

在JSON中键值对的顺序是无序的,然而在BSON中键的顺序很重要,{ firstname: "Phil", surname: "factor" }{ surname: "factor", firstname: "Phil" }是不一样的。

null和undefined混淆不清

undefined在JSON标准定义中从来没有出现过。它仅在JavaScript中出现。在BSON中已经弃用,换成了$null。避免在MongoDB中出现undefined

仅用$limit()而不用$sort()

通过我们通过使用$limit()来限制查询返回的结果数。但再最终版的代码中不能仅使用$limit(),因为这样无法保证结果的顺序,必须先使用$sort()来保证结果顺序,然后才能使用$limit()来限制数据结果数。