MongoDB规约

作者:陈贺
邮箱:hee0624@163.com

一. 文档规约

  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中写入自定义的内容。
  4. 【推荐】文档名的命名最好遵循“业务名称_文档的作用”

二. 索引规约

  1. 【强制】MongoDB 的组合索引使用策略与 MySQL 一致,遵循“最左原则”。
            说明:A、B、C组合索引覆盖了(A)、(A,B)、(A,B,C)三个索引。
  2. 【强制】唯一索引名为uk_字段名;普通索引名为idx_字段名;联合索引名为un_字段名缩写_字段名缩写。索引名称长度不要超过128字符;
            说明:-- 创建索引的完整方法
    db.collection.createIndex(keys , options) options: backgroud <boolean>;unique <boolean>;name <string>
  3. 【强制】单个集合索引个数不能超过64个。
            说明:索引加速查询性能,但会降低写入操作,每个index都应该被查询使用,定期检查无用索引。
  4. 【强制】创建索引要在后台创建,避免阻塞业务和查询。
  5. 【推荐】 创建索引建议:先做等值查询,在做排序,在做范围查询。

三. 语句规约

  1. 【强制】查询中的某些$ 操作符可能会导致性能低下,如 $ne$not$exists$nin$or,尽量在业务中不要使用。
            说明:$exist:因为松散的文档结构导致查询必须遍历每一个文档;$ne:如果当取 反的值为大多数,则会扫描整个索引;**$not:**可能会导致查询优化器不知道应当使用 哪个索引,所以会经常退化为全表扫描; **$nin:**全表扫描; **$or:**有多少个条件 就会查询多少次,最后合并结果集,所以尽可能的使用 $in
  2. 【强制】查询结果,按需project字段。不要返回所有结果。
  3. 【推荐】如果需要清理掉一个集合中的所有数据,那么remove()的性能是非常低下的,该场景下应当使用 drop()
  4. 【推荐】避免使用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);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值