本博客采用创作共用版权协议, 要求署名、非商业用途和保持一致. 转载本博客文章必须也遵循 署名-非商业用途-保持一致 的创作共用协议.
简介
NoSQL主要用于Web网站建设, 属于菲关系型数据库, 主要解决:
- 对数据库的高并发要求
- 对海量数据的高效率存储和访问
- 对数据库的高可扩展性和高可用性的需求
作为一个面向文档的数据库, MongoDB
是一个更加通用的NoSQL方案. 可以认为它是关系数据库的一个替代方案, 提供了 高性能, 高可用性, 自动扩展
- 一个记录在MongoDB被称为一个
文档
- 一个
文档
由域(field)和值(value)对组成(可以理解为key-value对) - 值可能又包含其他文档(嵌套概念)
- MongoDB的文档类似与JSON对象
- MongoDB想所有文档存储在
Collections
中(类似与关系数据库中的表概念) - MongoDB支持
二级索引
MongoDB中的文档可以想象成Python中字典数据结构注意掌握索引的应用, 加快大数据时查找速度
安装
基本操作
MongoDB不需要创建表操作
unicorns以及system.indexes。 system.indexes
在每个数据库中都会创建,它包含了数据库中的索引信息。
插入
- 使用
db.collection.insert()
向collection(相当于表名)中插入文档(document) - 返回一个WriteResult对象, 包含操作创建
可以创建一个变量, 保存多个要插入的文档
查找
查找规则
- 默认情况下, 会返回_id域, 可以使用
_id:0
不映射_id域 - 在
mongo shell
中find默认返回前20个查找到的文档 - 使用
find()
不加任何参数, 等价于find({}), 表示select * from collection
- find({
: })表示使用一个key-value作为选择条件 - and条件, find({
: , : , …}) - or条件, find( $or : [{
: }, { : }, …])
$lt、$lte、$gt、$gte以及$ne
分别表示小于、小于或等于、大于、大于或等于以及不等于, $exists
操作符用于匹配一个域是否存在, $or操作符并作用于需要进行或操作的数组, 更多查询符可以查看 Query and Projection Operators
- find的第二个可选参数(
该参数是一个列表
), 用户指明find读取的域
排序
1表示升序, -1表示降序
计数
- count命令
更新
-
update
根据所给条件找到文档, 然后用新的文档覆盖找到的整个文档
接收参数:
- 查找需要的更新文档的匹配条件
- 更新操作
- 可选的参数
默认情况下, update()更新单个文档, 如果需要更多多个文档, 使用 multi
可选参数
- mongo的
$set
修改符可以实现仅改动某个文档的某个值或几个域
-
$inc
修改符激昂一个域值增加一个正或负的值
-
$push
修改符增加一个新的值
插新
upsert
意思为如果存在则更新, 否则插入, 使用时将update第三个参数设置为true
多重更新
- 将
update
第四个参数设置为true, 表示对所有文档进行修改
删除
删除collection中所有文档, 更高效的删除所有文档是使用 drop()
删除符合匹配条件的文档
索引
索引的常见组织方式:
- 信息(对象/实例)关联一些特征(
正向索引
) - 每个特征后关联一批信息(对象/实例)(
反向索引又称倒排索引
)
MongoDB支持高效的索引查询, 索引是一个 数据结构
, 它收集collection中文档特定字段的值, MongoDB的查询优化器能够使用这种数据结构快速的对collection的文档进行查询和排序, 索引通过 B-Tree
实现
在MongoDB 3.0.0版本, ensureIndex()创建索引已经过时(不推荐使用), 请使用 createIndex()创建索引
索引类型
-
_id
索引(唯一, 默认创建) - 用户自定义升序/降序的单field索引
- 复合索引(多field), 其中
field出现顺序与索引排序相关
- 文本索引, 支持查找collection中的string内容
- 哈希索引,对field对应的值进行哈希作为索引,(only support equality matches)
索引特点
- MongoDB中索引是大小写敏感的
- 索引保存在system.indexs中, 运行
db.system.indexs.find()
查看
MongoDB官方文档的详细描述
创建索引
基本索引
field对应的值表示索引类型, 1表示索引为升序, -1表示索引为降序
唯一索引
如果对要创建唯一索引的field, 存在相同的值(value不唯一), 则不能创建唯一索引
内嵌文档中的key
MongoDB一个文档中的某个key创建索引
文档索引
复合索引
background索引
默认情况MongoDB在foreground(前景)中创建索引, 防止创建索引时的读写操作(同步阻塞的概念), 背景(background)允许创建索引的同时读写操作, 适用于大批量数据建立索引
文本索引(important)
可以对field, 值为字符串或字符串数据的field创建文本索引
查看索引
删除索引
适用场景和不足
适用场景
- 结构不固定, 有数据的嵌套
- 要求高并发性
- 频繁的数据水平拆分
- 内存大于数据量
不足之处
- 比较占用硬盘空间, 性能受内存影响
- 性能依赖内存, 同时无法指定内存大小, 容易被其他程序占用
- MongoDB不支持事务, 不支持join
- 每个Document限制是最大不超过4MB
参考链接
- NoSQL
- MongoDB Key/value硬盘存储
- Redis Key/value RAM存储
- MemcacheDB Key/value硬盘存储
- The Little MongoDB Book
- Mongo offical Doc
- SQL to MongoDB Mapping Chart