mongoDataModule、schema、适用场景 、facebookApi
summary_2018/06
mongodb
other
1、日常工作
- Mogondb_Data_Module学习
- facebook Api学习
- Mongodb使用场景
2、技术学习
- Mogondb Data Module
- 特点:数据十分灵活,mogondb集合不会强制文档格式,每个文档都可以匹配代表实体的数据字段,实际运用中,集合中的文档具有相似的结构
- 模型结构:引入(规范化模式)、嵌入式(非规范化模式)
- 建立数据模型的可能考虑因素(Mogondb特性、数据特征、读写操作)
- 文件增长
- 某些更新可能导致增长文档大小
- 使用MMAPv1存储引擎时,文档增长可能是您数据模型的一个考虑因素。对于MMAPv1,如果文档大小超过了该文档的分配空间,MongoDB会将文档重定位到磁盘上。但是,使用MongoDB 3.0.0时,默认使用Power of 2 Sized Allocations可以最大程度地减少重新分配的次数,并且可以有效地重用释放的记录空间。
- 原子性操作
- 嵌入式文档可以保证数据的原子性操作,当然若程序允许非原子性也是需要考虑的,但同时也会导致数据的冗余;引用可以解决数据冗余问题,但会有原子性的问题,因此需要视具体情况而定
- 分片
- Mogondb使用分片来提供水平缩放(将系统数据集和负载分配到多个服务器上,添加额外的服务器以根据需要增加容量。尽管单台机器的整体速度或容量可能并不高,但每台机器可处理整个工作负载的一部分,可能比单台高速大容量服务器提供更高的效率。)
- 选择分片键(字段)对性能有十分重大的影响(分布是否均匀)
- Tips:垂直缩放(增加单个服务器的容量、CPU、RAM),相比于水平缩放增加了经济开销,减少了数据库集群配置的工作
- 索引
- 索引常用来提高查询性能,但会对写操作会有一定的影响,消耗掉一定的内存
- MongoDB始终对该_id领域进行索引,对于较小的文档,这可能会占用大量的空间。
- 较短的索引,影响可读性,并不会减少索引的大小,因为mogondb索引的结构是固定的。(不像mysql的聚簇索引(主键聚集))
- 大量集合(不是单一集合)
- 比如日志分类:log_dev,log_err
- 集合分离对大量数据、和高吞吐率可能会表现得更好(类似mysql的分表操作)
- 集合包含大量的小文档
- MongoDB客户端自动_id为每个文档添加一个字段,并为该 字段生成一个唯一的12字节ObjectId_id,并建立索引。对较多较小的的文档可能会占用大量空间。
- 数据的生命周期
- Mogondb Module Example
- 特定模型(原子操作、关键字搜索、货币、时间)
- 货币
- 数字模型和非数字模型(不需要运算
- 数字模型
1、使用DecimalBSON类型,这是一种基于十进制的浮点格式,能够提供精确的精度。(v>=3.4)
Tips(精度):The decimal BSON type uses the IEEE 754 decimal128 floating-point numbering format which supports 34 decimal digits (i.e. significant digits) and an exponent range of −6143 to +6144.(NumberDecimal("1000.55")最好加上引号,有可能丢失精度)
2、使用比例因子long通过乘以10比例因子的幂将货币值转换为64位整数(BSON类型)。
- 非数字模型
1、在一个字段中,将确切的货币值编码为非数字数据类型; 例如,BinData或者a string。
2、在第二个字段中,存储精确值的双精度浮点近似值。
- 模式验证(即插入和更新进行模式验证)
- 指定验证规则
- 创建时:使用 db.createCollection()该validator选项
- 添加到现有集合:使用collMod包含该validator选项的命令
- Json Schema(start at v3.6)
- Tips:默认除validator字段外允许有额外的字段。
- for example
db.createCollection("students", {
validator: {
$jsonSchema: {
bsonType: "object",
required: [ "name", "year", "major", "gpa" ],
properties: {
name: {
bsonType: "string",
description: "must be a string and is required"
},
gender: {
bsonType: "string",
description: "must be a string and is not required"
},
year: {
bsonType: "int",
minimum: 2017,
maximum: 3017,
exclusiveMaximum: false,
description: "must be an integer in [ 2017, 3017 ] and is required"
},
major: {
enum: [ "Math", "English", "Computer Science", "History", null ],
description: "can only be one of the enum values and is required"
},
gpa: {
bsonType: [ "double" ],
minimum: 0,
description: "must be a double and is required"
}
}
}
}
})
- Query Expressions
- In addition to JSON Schema validation, MongoDB supports validation with query filter expressions using the query operators, with the exception of $near, $nearSphere, $text, and $where.
- for example
db.createCollection( "contacts",
{ validator: { $or:
[
{ phone: { $type: "string" } },
{ email: { $regex: /@mongodb\.com\$/ } },
{ status: { $in: [ "Unknown", "Incomplete" ] } }
]
}
} )
- Behavior(TIPS)
- exist Documents
- 如果validationLevel是strict(默认),MongoDB将验证规则应用于所有插入和更新。
如果validationLevel是moderate,MongoDB应用验证规则来插入并更新已经满足验证条件的现有文档。通过moderate级别,对不符合验证标准的现有文档的更新不会被检查有效性。
- deal(validationAction)
- 如果validationAction是error(默认),MongoDB拒绝任何违反验证条件的插入或更新。
如果validationAction是warn,MongoDB会记录任何违规行为,但允许插入或更新继续。
- Restricions
- You cannot specify a validator for collections in the admin, local, and config databases.
- Pass Documents Validation
- Users can bypass document validation using the bypassDocumentValidation option.
MongoDB 特性 |
介绍 |
事务支持 |
MongoDB目前只支持单文档事务,需要复杂事务支持的场景暂时不适合 |
灵活的文档模型 |
BSON格式存储最接近真实对象模型,对开发者友好,方便快速开发迭代 |
高可用复制集 |
满足数据高可靠、服务高可用的需求,运维简单,故障自动切换 |
可扩展分片集群 |
海量数据存储,服务能力水平扩展 |
高性能 |
mmapv1、wiredtiger、mongorocks(rocksdb)、in-memory 等多引擎支持满足各种场景需求 |
强大的索引支持 |
地理位置索引可用于构建 各种 O2O 应用、文本索引解决搜索的需求、TTL索引解决历史数据自动过期的需求 |
Gridfs |
解决文件存储的需求 |
aggregation & mapreduce |
解决数据分析场景需求,用户可以自己写查询语句或脚本,将请求都分发到 MongoDB 上完成、 |
一些需要关注的点
- 性能更好,文档结构更加灵活,可拓展性,数据分析
- 不支持事务,对于复杂查询较麻烦
比如一些常见使用场景
- 快递等地理位置信息
- 监控等数据,不用更改表结构,可以增加字段
- 一些日志记录,数据抓取(格式不固定)
大家可以看一下这篇知乎:
MongoDB 等 NoSQL 与关系型数据库相比,有什么优缺点及适用场景?
3、思考与总结
- 思考关于数据库的区别,选择,需要考虑的一些因素,及常用数据库间的一些区别