MongoDB规约

MongoDB规约

一. 文档规约

  1. 【强制】库名、集合名和字段名必须使用小写字母或数字或下划线,禁止出现数字和下划线开头。数据库字段名修改代价很大,所以字段名称需要慎重考虑。
  2. 【强制】库名和集合名不使用复数名词。

说明:集合名应该仅仅表示集合里面的文档内容,不应该表示数量。

  1. 【强制】禁用保留字,如update,find,find_one,set,push,sort等,请参考MongoDB官方保留字。
  2. 【强制】表达是与否概念的字段,必须使用is_xxx的方式命名。
  3. 【强制】文档中必备三个字段:_id, create_time,uptime_time。其中_id为主键,自动创建,禁止向_id中写入自定义内容。

说明:id是MongoDB中的默认主键,一旦_id的值为非自增,当数据量达到一定程度之后,每一次写入都可能导致主键的二叉树大幅度调整,这将是一个代价极大的写入, 所以写入就会随着数据量的增大而下降,所以一定不要在_id中写入自定义的内容。

  1. 【推荐】文档名的命名最好遵循“业务名称_文档的作用”

二. 索引规约

  1. 【强制】MongoDB 的组合索引使用策略与 MySQL 一致,遵循“最左原则”。

说明:A、B、C组合索引覆盖了(A)、(A,B)、(A,B,C)三个索引。

  1. 【强制】唯一索引名为uk字段名;普通索引名为idx字段名;联合索引名为un字段名缩写字段名缩写。索引名称长度不要超过128字符;

说明:— 创建索引的完整方法 db.collection.createIndex(keys , options) options: backgroud ;unique ;name

  1. 【强制】单个集合索引个数不能超过64个。

说明:索引加速查询性能,但会降低写入操作,每个index都应该被查询使用,定期检查无用索引。

  1. 【强制】创建索引要在后台创建,避免阻塞业务和查询。
  2. 【推荐】 创建索引建议:先做等值查询,在做排序,在做范围查询。

三. 语句规约

  1. 【强制】查询中的某些 $ 操作符可能会导致性能低下,如 $ne,$not,$exists,$nin,$or,尽量在业务中不要使用。

说明:$exist:因为松散的文档结构导致查询必须遍历每一个文档;$ne:如果当取 反的值为大多数,则会扫描整个索引;$not:可能会导致查询优化器不知道应当使用 哪个索引,所以会经常退化为全表扫描; $nin:全表扫描; $or:有多少个条件 就会查询多少次,最后合并结果集,所以尽可能的使用 $in;

  1. 【强制】查询结果,按需project字段。不要返回所有结果。
  2. 【推荐】如果需要清理掉一个集合中的所有数据,那么 remove() 的性能是非常低下的,该场景下应当使用 drop()。
  3. 【推荐】避免使用skip略过大量的结果。

说明:当数据量大时候,寻找不适用skip的情况 下使用分页。

正例:var page1 = db.foo.find().sort({“date”:-1}).limit(100)

​ 然后利用最后一个文档中“date”的值作为查询条件,获取下一页;

​ var page2 = db.foo.find({“date”: {“$gt”: latest.date}});

​ page2 = page2.sort({“date”: -1}).limit(100);

反例:var page1 = db.foo.find(criteria).limit(100);

​ var page2 = db.foo.find(criteria).skip(100).limit(100);