概念解析

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)

其它方法:


其它操作

条件操作符
条件|操作符
–|–
大于|$gt
小于|$lt
大于等于|$gte
小于等于|$lte

1
2
db.col.find({likes : {$gte : 100}})
//获取"col"集合中 "likes" 大于等于 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
2
3
4
5
6
7
8
db.articles.aggregate([
{ $match : { score : { $gt : 70, $lte : 90 } } },
{ $group: { _id: null, count: { $sum: 1 } } }
]);
/*
$match用于获取分数大于70小于或等于90记录,
然后将符合条件的记录送到下一阶段$group管道操作符进行处理
*/

MongoDB 复制(副本集)
MongoDB复制是将数据同步在多个服务器的过程。复制提供了数据的冗余备份,并在多个服务器上存储数据副本,提高了数据的可用性, 并可以保证数据的安全性。复制还允许您从硬件故障和服务中断中恢复数据。

MongoDB 分片
在Mongodb里面存在另一种集群,就是分片技术,可以满足MongoDB数据量大量增长的需求。当MongoDB存储海量的数据时,一台机器可能不足以存储数据,也可能不足以提供可接受的读写吞吐量。这时,我们就可以通过在多台机器上分割数据,使得数据库系统能存储和处理更多的数据。

MongoDB 备份(mongodump)与恢复(mongorestore)
备份数据命令mongodump
恢复数据命令mongorestore

MongoDB 监控
在你已经安装部署并允许MongoDB服务后,你必须要了解MongoDB的运行情况,并查看MongoDB的性能。这样在大流量得情况下可以很好的应对并保证MongoDB正常运作。
进入安装MongoDB目录下的bin目录使用命令:
mongostat间隔固定时间获取mongodb的当前运行状态,并输出
mongotop <options>跟踪一个MongoDB的实例,查看哪些大量的时间花费在读取和写入数据


连接数据库

javahttp://www.runoob.com/mongodb/mongodb-java.html
PHPhttp://www.runoob.com/mongodb/mongodb-php.html
Node.jshttp://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 ObjectId
ObjectId() 中存储了4个字节的时间戳,所以你不需要为你的文档保存时间戳字段,可以通过 getTimestamp 函数来获取文档的创建时间。

MongoDB Map Reduce
Map-Reduce是一种计算模型,简单的说就是将大批量的工作(数据)分解(MAP)执行,然后再将结果合并成最终结果(REDUCE)。

1
2
3
4
5
6
7
8
9
10
db.collection.mapReduce(
function() {emit(key,value);}, //map 函数
function(key,values) {return reduceFunction}, //reduce 函数
{
out: collection,
query: document,
sort: document,
limit: number
}
)

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 一样有自动增长的功能,可以通过编程的方式实现。