MongoDB
概念解析
SQL术语/概念 | MongoDB术语/概念 | 解释/说明 |
---|---|---|
database | database | 数据库 |
table | collection | 数据库表/集合 |
row | document | 数据记录行/文档 |
column | field | 数据字段/域 |
index | index | 索引 |
table.joins() | 表连接,MongoDB不支持 | |
primary key | primary key | 主键,MongoDB自动将_id字段设置为主键 |
结构
数据库
有一些数据库名是保留的,可以直接访问这些有特殊作用的数据库:
admin
:从权限的角度来看,这是”root”数据库。要是将一个用户添加到这个数据库,这个用户自动继承所有数据库的权限。一些特定的服务器端命令也只能从这个数据库运行,比如列出所有的数据库或者关闭服务器。local
: 这个数据永远不会被复制,可以用来存储限于本地单台服务器的任意集合config
: 当Mongo用于分片设置时,config数据库在内部使用,用于保存分片的相关信息。
文档
文档是一组键值(key-value)对(即BSON)。MongoDB 的文档不需要设置相同的字段,并且相同的字段不需要相同的数据类型,这与关系型数据库有很大的区别,也是 MongoDB 非常突出的特点。
- 文档中的键/值对是有序
- 文档中的值不仅可以是在双引号里面的字符串,还可以是其他几种数据类型(甚至可以是整个嵌入的文档)
- 不能有重复的键
- 文档的键是字符串
- 以下划线”_”开头的键是保留的(不是严格要求的)
集合
集合就是 MongoDB 文档组,类似于关系数据库管理系统中的表格,集合存在于数据库中,集合没有固定的结构
- 集合名不能以”system.”开头
- 不要在名字里出现$
元数据
ObjectId 类似唯一主键,前4个字节是时间戳,_id键的值默认是个 ObjectId 对象,ObjectId().getTimestamp()
可获取文档的创建时间
基本操作
以管理员身份打开控制台,输入mongo进入命令控制台:
显示:
show dbs
显示所有数据库的列表db
显示当前数据库对象或集合show collections
查看已有集合show tables
显示当前数据库下的所有集合use + dbName
切换到指定数据库(如果数据库不存在,则创建数据库)
删除:
db.dropDatabase()
删除当前数据库db.collectionName.drop()
删除整个collection
创建:
db.createCollection(name, options)
创建集合db.collectionName.insert(document)
插入文档db.collectionName.save(document)
不指定 _id 字段跟insert一样,指定 _id 字段,则会更新该 _id 的数据db.collectionName.update({query}, {update}, {options})
更新文档db.collectionName.remove({query}, {options})
删除文档
查找:
db.collectionName.find({query}, projection)
query中AND直接以逗号分隔key:{key1:value1, key2:value2}
,OR则使用{$or: [{key1: value1}, {key2:value2}]}
,AND和OR可组合使用db.collectionName.find().limit(num)
指定读取的条数db.collectionName.find().skip(num)
指定跳过的条数db.collectionName.find().sort({key: 1})
对指定的key排序(升序1,降序-1)
其它方法:
db.collectionName.createIndex(keys, options)
创建索引db.collectionName.aggregate(options)
聚合方法,计算某个字段的总和、平均值等http://www.runoob.com/mongodb/mongodb-aggregate.html
其它操作
条件操作符
条件|操作符
–|–
大于|$gt
小于|$lt
大于等于|$gte
小于等于|$lte
1 | db.col.find({likes : {$gte : 100}}) |
$type
操作符是基于BSON类型来检索集合中匹配的数据类型,并返回结果。
http://www.runoob.com/mongodb/mongodb-operators-type.html
管道的概念
http://www.runoob.com/mongodb/mongodb-aggregate.html
管道在Unix和Linux中一般用于将当前命令的输出结果作为下一个命令的参数。
MongoDB的聚合管道将MongoDB文档在一个管道处理完毕后将结果传递给下一个管道处理。
1 | db.articles.aggregate([ |
MongoDB 复制(副本集)
MongoDB复制是将数据同步在多个服务器的过程。复制提供了数据的冗余备份,并在多个服务器上存储数据副本,提高了数据的可用性, 并可以保证数据的安全性。复制还允许您从硬件故障和服务中断中恢复数据。
MongoDB 分片
在Mongodb里面存在另一种集群,就是分片技术,可以满足MongoDB数据量大量增长的需求。当MongoDB存储海量的数据时,一台机器可能不足以存储数据,也可能不足以提供可接受的读写吞吐量。这时,我们就可以通过在多台机器上分割数据,使得数据库系统能存储和处理更多的数据。
MongoDB 备份(mongodump)与恢复(mongorestore)
备份数据命令mongodump
恢复数据命令mongorestore
MongoDB 监控
在你已经安装部署并允许MongoDB服务后,你必须要了解MongoDB的运行情况,并查看MongoDB的性能。这样在大流量得情况下可以很好的应对并保证MongoDB正常运作。
进入安装MongoDB目录下的bin目录使用命令:mongostat
间隔固定时间获取mongodb的当前运行状态,并输出mongotop <options>
跟踪一个MongoDB的实例,查看哪些大量的时间花费在读取和写入数据
连接数据库
java
:http://www.runoob.com/mongodb/mongodb-java.htmlPHP
:http://www.runoob.com/mongodb/mongodb-php.htmlNode.js
:http://www.runoob.com/nodejs/nodejs-mongodb.html
深入
MongoDB 关系
嵌入式关系:数据保存在单一的文档中,容易获取和维护,但读写性能差
引用式关系:数据保存在不同的文档中,结构清晰
MongoDB 数据库引用
使用 DBRefs,可以让一个文档从多个集合中引用文档。
MongoDB 覆盖索引查询
尽量使用索引查询,从索引中获取数据比通过扫描文档读取数据要快得多,数据量大的时候,效果更明显。
MongoDB 查询分析explain()
操作提供了查询信息,使用索引及查询统计等,有利于我们对索引的优化hint()
可强制 MongoDB 使用一个指定的索引
MongoDB 原子操作
mongodb不支持事务,所以,在你的项目中应用时,要注意这点。无论什么设计,都不要要求mongodb保证数据的完整性。
但是mongodb提供了许多原子操作,比如文档的保存,修改,删除等,都是原子操作。所谓原子操作就是要么这个文档保存到Mongodb,要么没有保存到Mongodb,不会出现查询到的文档没有保存完整的情况。
MongoDB 高级索引
http://www.runoob.com/mongodb/mongodb-advanced-indexing.html
索引数组
索引子文档
MongoDB 索引限制
http://www.runoob.com/mongodb/mongodb-indexing-limitations.html
使用索引有一些限制条件
MongoDB ObjectIdObjectId()
中存储了4个字节的时间戳,所以你不需要为你的文档保存时间戳字段,可以通过 getTimestamp 函数来获取文档的创建时间。
MongoDB Map Reduce
Map-Reduce是一种计算模型,简单的说就是将大批量的工作(数据)分解(MAP)执行,然后再将结果合并成最终结果(REDUCE)。
1 | db.collection.mapReduce( |
MongoDB 全文检索
http://www.runoob.com/mongodb/mongodb-text-search.html
全文检索对每一个词建立一个索引,指明该词在文章中出现的次数和位置,当用户查询时,检索程序就根据事先建立的索引进行查找,并将查找的结果反馈给用户的检索方式。
MongoDB 正则表达式
MongoDB使用$regex
操作符来设置匹配字符串的正则表达式。
MongoDB 管理工具: Rockmongo
RockMongo是PHP5写的一个MongoDB管理工具。
MongoDB GridFS
http://www.runoob.com/mongodb/mongodb-gridfs.html
GridFS 用于存储和恢复那些超过16M(BSON文件限制)的文件(如:图片、音频、视频等)。
GridFS 也是文件存储的一种方式,但是它是存储在MonoDB的集合中。
GridFS 可以更好的存储大于16M的文件。
GridFS 会将大文件对象分割成多个小的chunk(文件片段),一般为256k/个,每个chunk将作为MongoDB的一个文档(document)被存储在chunks集合中。
GridFS 用两个集合来存储一个文件:fs.files与fs.chunks。
每个文件的实际内容被存在chunks(二进制数据)中,和文件有关的meta数据(filename,content_type,还有用户自定义的属性)将会被存在files集合中。
MongoDB 固定集合(Capped Collections)
http://www.runoob.com/mongodb/mongodb-capped-collections.html
MongoDB 固定集合(Capped Collections)是性能出色且有着固定大小的集合,对于大小固定,我们可以想象其就像一个环形队列,当集合空间用完后,再插入的元素就会覆盖最初始的头部的元素。
MongoDB 自动增长
MongoDB 没有像 SQL 一样有自动增长的功能,可以通过编程的方式实现。