1. MongoDB简介
一、MongoDB简介
MongoDB是由10gen公司(现已改名为MongoDB Inc.)用C++语言研发的一款数据库,于2009年开源
MongoDB按照类似于JSON的格式存储数据,称作BSON (binary json),由成对的field和value构成,value除了数值和字符之外也可以包括数组([ ]),其他文档等
每一条数据称作一个文档(document)
相对传统关系型数据库,文档之间可以有不一样的格式(字段field),因此更加灵活
可以为数据创建索引,使用特定查询方式来分析统计数据
MongoDB开源免费,遵从GNU GPL协定
二、MongoDB使用的业务场景
适用于:
存储表结构不确定或经常变换的业务数据
数据量很大,但价值较低的数据
数据实时性要求高的数据,MongoDB批量插入性能非常高
不适用于:
对事务要求高的业务;和传统关系型数据库比较,MongoDB对事务的支持较差
需要使用SQL的业务场景
2. 相关术语
一、与传统数据库对照
二、数据库(database)
一个mongodb中可以建立多个数据库。
MongoDB的默认数据库为"db",该数据库存储在data目录中。
MongoDB的单个实例可以容纳多个独立的数据库,每一个都有自己的集合和权限,不同的数据库也放置在不同的文件中。
数据库也通过名字来标识。数据库名可以是满足以下条件的任意UTF-8字符串。
不能是空字符串(“”)。
不得含有’ '(空格)、.、$、/、\和\0 (空字符)。
应全部小写。
最多64字节。
有一些数据库名是保留的,可以直接访问这些有特殊作用的数据库。
admin: 从权限的角度来看,这是"root"数据库。要是将一个用户添加到这个数据库,这个用户自动继承所有数据库的权限。一些特定的服务器端命令也只能从这个数据库运行,比如列出所有的数据库或者关闭服务器。
local: 这个数据永远不会被复制,可以用来存储限于本地单台服务器的任意集合
config: 当Mongo用于分片设置时,config数据库在内部使用,用于保存分片的相关信息。
三、集合(collection)
集合就是 MongoDB 文档组,类似于 关系数据库中的表格。
集合存在于数据库中,集合没有固定的结构,这意味着你在对集合可以插入不同格式和类型的数据,但通常情况下我们插入集合的数据都会有一定的关联性。
合法的集合名
集合名不能是空字符串""。
集合名不能含有\0字符(空字符),这个字符表示集合名的结尾。
集合名不能以"system."开头,这是为系统集合保留的前缀。
用户创建的集合名字不能含有保留字符。有些驱动程序的确支持在集合名里面包含,这是因为某些系统生成的集合中包含该字符。除非你要访问这种系统创建的集合,否则千万不要在名字里出现$。
capped collections
Capped collections 就是固定大小的collection,当document个数超过指定个数,再插入的元素就会覆盖最初始的头部的元素!
优点:
对固定集合进行插入速度极快
按照插入顺序的查询输出速度极快
能够在插入最新数据时,淘汰最早的数据
用途:
储存日志信息
缓存一些少量的文档
限制:
能进行更新,然而,对象不会增加存储空间。如果增加,更新就会失败 。
使用 Capped Collection 不能删除一个文档,可以使用 drop() 方法删除 collection 所有的行。
删除之后,你必须显式的重新创建这个 collection。
三、文档(Document)
特点:
文档是一组键值(key-value)对(即 BSON)。MongoDB 的文档不需要设置相同的字段,并且相同的字段不需要相同的数据类型,这与关系型数据库有很大的区别,也是 MongoDB 非常突出的特点。
文档中的键/值对是有序的。
文档中的值不仅可以是在双引号里面的字符串,还可以是其他几种数据类型(甚至可以是整个嵌入的文档)。
MongoDB区分类型和大小写。
MongoDB的文档不能有重复的键。
文档的键是字符串。除了少数例外情况,键可以使用任意UTF-8字符。
文档键命名规范:
键不能含有\0 (空字符)。这个字符用来表示键的结尾。
.和$有特别的意义,只有在特定环境下才能使用。
以下划线"_"开头的键是保留的(不是严格要求的)。
四、元数据
在MongoDB数据库中名字空间 .system.* 是包含多种系统信息的特殊集合(Collection),如下:
| 集合命名空间 | 描述 |
| — | — |
| dbname.system.namespaces | 列出所有名字空间。 |
| dbname.system.indexes | 列出所有索引。 |
| dbname.system.profile | 包含数据库概要(profile)信息。 |
| dbname.system.users | 列出所有可访问数据库的用户。 |
| dbname.local.sources | 包含复制对端(slave)的服务器信息和状态。 |
对于修改系统集合中的对象有如下限制。
在{{system.indexes}}插入数据,可以创建索引。但除此之外该表信息是不可变的(特殊的drop index命令将自动更新相关信息)。
{{system.users}}是可修改的。 {{system.profile}}是可删除的。
五、MongoDB 数据类型
3.基本操作
一、查看数据库
查看所有数据库
show dbs
二、创建(切换)数据库
创建数据库
use adc
> show dbs
我们刚创建的数据库并不在数据库的列表中, 要显示它,我们需要向db数据库插入一些数据。
db.adc.insert({“name”:“测试数据库”})
> show dbs
三、删除数据库
切换至需要删除的数据库
use adc
> db
删除数据库
db.dropDatabase()
4. 集合
一、创建集合
语法格式:
db.createCollection(name, options)
参数说明:
name: 要创建的集合名称
options: 可选参数, 指定有关内存大小及索引的选项
options 可以是如下参数:
| 字段 | 类型 | 描述 |
| — | — | — |
| capped | 布尔 | (可选)如果为 true,则创建固定集合。固定集合是指有着固定大小的集合,当达到最大值时,它会自动覆盖最早的文档。
当该值为 true 时,必须指定 size 参数。 |
| autoIndexId | 布尔 | (可选)如为 true,自动在 _id 字段创建索引。默认为 false。 |
| size | 数值 | (可选)为固定集合指定一个最大值,以千字节计(KB)。
如果 capped 为 true,也需要指定该字段。 |
| max | 数值 | (可选)指定固定集合中包含文档的最大数量。 |
二、查看集合
show collections
show tables
三、删除集合
语法格式:
db.collection.drop()
返回值
如果成功删除选定集合,则 drop() 方法返回 true,否则返回 false。
示例
查看集合
show collections
删除mycol2集合
db.mycol2.drop()
查看集合
show collections
5. 文档
一、插入文档
语法
插入单条数据
db.COLLECTION_NAME.insert(document)
db.COLLECTION_NAME.insertOne(document)
插入多条数据
db.collection.insertMany(document)
二、更新文档
update() 方法
update() 方法用于更新已存在的文档。语法格式如下:
db.collection.update(
,
,
{
upsert: ,
multi: ,
writeConcern:
}
)
参数说明:
| query | update的查询条件,类似sql update查询内where后面的。 |
| — | — |
| update | update的对象和一些更新的操作符(如$,$inc…)等,也可以理解为sql update查询内set后面的 |
| upsert | 可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。 |
| multi | 可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。 |
| writeConcern | 可选,抛出异常的级别。 |
save() 方法
save() 方法通过传入的文档来替换已有文档。语法格式如下:
db.collection.save(
,
{
writeConcern:
}
)
参数说明:
**document **: 文档数据。
**writeConcern **:可选,抛出异常的级别。
三、MongoDB 删除文档
语法
remove() 方法的基本语法格式如下所示:
db.collection.remove(
,
{
justOne: ,
writeConcern:
}
)
参数说明:
**query **:(可选)删除的文档的条件。
**justOne **: (可选)如果设为 true 或 1,则只删除一个文档,如果不设置该参数,或使用默认值 false,则删除所有匹配条件的文档。
**writeConcern **:(可选)抛出异常的级别。
使用 find() 函数查询数据:
db.col.find()
接下来我们移除 title 为 ‘MongoDB 教程’ 的文档:
db.col.remove({‘title’:‘MongoDB 教程’})
WriteResult({ “nRemoved” : 2 }) # 删除了两条数据
>db.col.find()
如果你只想删除第一条找到的记录可以设置 justOne 为 1,如下所示:
db.COLLECTION_NAME.remove(DELETION_CRITERIA,1)
如果你想删除所有数据,可以使用以下方式(类似常规 SQL 的 truncate 命令):
db.col.remove({})
>db.col.find()
四、MongoDB 查询文档
语法
查询所有文档
db.collection.find(query,projection)
查询第一条记录
db.collection.findOne(query, projection)
格式化显示查询结果
db.col.find().pretty()
选项
query:可选,使用查询操作符指定查询条件
projection:可选,使用投影操作符指定返回的键。查询时返回文档中所有键值, 只需省略该参数即可(默认省略)。