MongoDB入门
1、基本概念
Name | Descripe |
---|---|
文档 | 文档是 MongoDB 中数据的基本单位,是一组有序键值 的集合 。类似于关系数据库中的一行行数据 。通常以键---值对 的形式存在于数据库中。一般情况键是字符串 类型,区分大小写 、并且不能包含重复的键(唯一性)。 |
集合 | 集合是一组 MongoDB文档的组合,类似于关系型数据库(例如 MySQL)中的数据表 。集合没有固定的结构,可以插入不同格式或类型的数据。 |
数据库 | MongoDB使用数据库对集合进行分组。一个MongoDB实例可以承载多个数据库,每个数据库有零个或多个集合。 |
2、数据类型
数据类型 | 描述 |
---|---|
String | 字符串类型,是最常用的数据类型,不过在 MongoDB 中,只有 UTF-8 编码的字符串才是合法的 |
Integer | 整型,用于存储数值。根据您使用服务器的不同,整型可以分为 32 位或 64 位两种 |
Boolean | 布尔型,用于存储布尔类型的值(true/false) |
Double | 双精度浮点型,用于存储浮点型(小数)数据 |
Min/Max keys | 将一个值与 BSON 元素的最低值和最高值相对比 |
Array | 数组类型,用于将数组、列表或多个值存储在一个键中 |
Timestamp | 时间戳,记录文档修改或添加的具体时间 |
Object | 用于内嵌文档 |
Null | 用于创建空值 |
Symbol | 符号,该数据类型于字符串类型类似,不同的是,它一般用于采用特殊符号类型的语言 |
Date | 日期时间,用 UNIX 时间格式来存储当前日期或时间,您可以创建 Date 对象并将 date、month、year 的值传递给 Date 对象来指定自己的日期时间 |
Object ID | 对象 ID,用于创建文档的 ID |
Binary Data | 二进制数据,用于存储二进制数据 |
Code | 代码类型,用于在文档中存储 JavaScript 代码 |
Regular expression | 正则表达式类型,用于存储正则表达式 |
Object ID
Object ID 类似于关系型数据库中的主键 ID,在 MongoDB 中 Object ID 由 12 字节的字符组成,其中:
- 前 4 个字节表示当前的 Unix 时间戳;
- 之后的 3 个字节是当前设备的机器标识码;
- 再之后的 2 个字节是 MongoDB 服务器的进程 id;
- 最后 3 个字节为计数器,计数器的起始值随机获得。
bash
601e2b6b aa203c c89f 2d31aa
↑ ↑ ↑ ↑
时间戳 机器码 进程id 计数器
Timestamp
Timestamps(时间戳)类型用来在 MongoDB 的内部使用,与 Date 类型不同,Timestamps 由一个 64 位的值构成,其中:
- 前 32 位是一个 Unix 时间戳(由 Unix 纪元(1970.1.1)开始到现在经过的秒数);
- 后 32 位是一秒内的操作序数。
在一个 MongoDB 实例中,时间戳是唯一的,而且主要在 MongoDB 内部使用,在应用开发中,您可以使用 Date 类型来定义时间日期。
Date
Date 类型是一个 64 位的对象,其中存放了从 Unix 纪元(1970.1.1)开始到现在经历的毫秒数,Date 类型是有符号的,负值则表示 1970.1.1 之前的时间。
3、创建数据库
在MongoDB中使用use命令来创建数据库,如果该数据库不存在,则会创建一个新的数据库,如果该数据库已经存在,则将切换到该数据库。使用use
命令创建数据库的语法格式如下:
bash
use database_name;
例如,创建一个名字为mg_pp的数据库,使用如下命令:
bash
use mg_pp;
# 出现如下语句,说明数据库创建成功
switched to db mg_pp
数据库创建成功后,您可以使用db
命令来查看当前选择的数据库,如下所示:
bash
db;
# 输入db会显示当前选择的数据库
mg_pp
显示MongoDB中所有的数据库,使用如下命令:
bash
show dbs;
# 这个命令只会显示MGDB中所有不为空的数据库,新创建的数据库中没有数据,故不显示
这个时候就需要向新创建的数据库中插入数据:
bash
db.users.insertOne({ username : "panpan" , password : "123123"});
# 其中users是集合,类似于关系型数据库中的表
# 插入的json字符串,即是文档,对应关系型数据库表中的一行记录
插入数据之后,当我们再次执行show dbs;就会发现我们新创建的数据库了。
bash
[
{
"empty": false,
"name": "admin",
"sizeOnDisk": 151552
},
{
"empty": false,
"name": "config",
"sizeOnDisk": 110592
},
{
"empty": false,
"name": "local",
"sizeOnDisk": 73728
},
# 这个就是新建的数据库 mg_pp
{
"empty": false,
"name": "mg_pp",
"sizeOnDisk": 8192
}
]
4、删除数据库
删除当前数据库的语法格式
bash
db.dropDatabase();
要删除指定的数据库之前,需要先进入该数据库:
bash
use test_delete_db;
# 删除数据库
db.dropDatabase();
# 检查是否删除成功
show dbs;
5、常用命令
5.1、创建集合
MongoDB创建集合(数据表)语句如下:
bash
db.createCollection(name, options);
- name: 要创建的集合名称;
- options: 可选参数, 指定有关内存大小及索引的选项,可选值如下表所示:
字段 | 类型 | 描述 |
---|---|---|
capped | 布尔 | (可选)如果为 true,则创建固定集合,固定集合是指有着固定大小的集合,当达到最大值时,它会自动覆盖最早的文档,注意:如果该值为 true,则必须指定 size 参数 |
autoIndexId | 布尔 | (可选)如为 true,则自动在 _id 字段创建索引,默认为 false,注意:MongoDB 3.2 之后不再支持该参数 |
size | 数值 | (可选)为固定集合指定一个最大值,即字节数,如果 capped 为 true,则需要指定该字段 |
max | 数值 | (可选)指定固定集合中包含文档的最大数量 |
使用show collections
命令或者show tables
命令来查看数据库中的集合
bash
show collections;
show tables;
创建固定集合"mycol",整个集合空间大小为 102400 KB, 文档最大个数为 1000 个
bash
db.createCollection("mycol", { capped : true, size : 102400, max : 1000 } )
虽然 MongoDB 中提供了单独的创建集合的方法,但通常我们不需要手动创建集合,因为当您在插入文档时,MongoDB 会自动创建集合。
5.2、删除集合
删除集合的语法如下:
bash
db.collection_name.drop()
collection_name: 需要删除集合的名称
drop:不需要携带任何参数
5.3、插入文档
使用insert()插入文档:
bash
# 插入一条文档
db.users.insertOne({ username : "panpan" , password : "123123"});
# 批量插入文档
db.users.insertMany([
{ username : "panpan111" , password : "111"},
{ username : "panpan222" , password : "222"}
])
# 插入之后使用find()进行查看
db.users.find();
5.4、查询文档
使用find()查询文档,语法如下:
bash
db.collection_name.find(query, projection);
- query:可选参数,使用查询操作符指定查询条件
- projection:可选参数,使用投影操作符指定返回的键。查询时若要返回文档中所有键值,只需省略该参数即可(默认省略)
pretty() 方法来格式化查询到的结果:
bash
db.collection_name.find(query, projection).pretty()
findOne()方法只能返回一个查询到的文档:
bash
db.collection_name.findOne(query, projection)
投影操作
bash
db.collection_name.find(query,{key1:1, key2:1, ...})
- query:可选参数,使用查询操作符指定的查询条件;
- key1、key2、...:为要查询或者隐藏的字段,当值为 1 时表示显示该字段,值为 0 时表示隐藏该字段。
5.5、更新文档
update() 方法用于更新现有文档中的值,其语法格式如下:
bash
db.collection_name.update(
<query>,
<update>,
{
upsert: <boolean>,
multi: <boolean>,
writeConcern: <document>
}
)
- query:update 的查询条件,类似 SQL 中 update 语句内 where 后面的内容;
- update:update 的对象和一些更新的操作符(如 、 、 、inc...)等,也可以理解为 SQL 中 update 语句内 set 后面的内容;
- upsert:可选参数,默认值为 false,用来定义当要更新的记录不存在时,是否当作新记录插入到集合中,当值为 true 时表示插入,值为 false 时不插入;
- multi:可选参数,默认值为 false,用来表示只更新找到的第一条记录,当值为 true 时,则把按条件查出来的多条记录全部更新;
- writeConcern:可选参数,用来定义抛出异常的级别。
save() 方法可以使用传入的文档来替换已有文档,若 _id 主键存在则更新已有文档,若 _id 主键不存在则作为新数据插入到集合中。
语法格式如下:
bash
db.collection_name.save(
<document>,
{
writeConcern: <document>
}
)
- document : 文档数据;
- writeConcern :可选,抛出异常的级别。
5.6、删除文档
delete() 方法从集合中删除文档,语法格式如下:
bash
db.collection_name.delete(
<query>,
{
justOne: <boolean>,
writeConcern: <document>
}
)
- query:可选参数,定义要删除文档的条件;
- justOne:可选参数,如果设为 true 或 1,则只删除一个文档,如果不设置该参数,或使用默认值 false,则删除所有匹配条件的文档;
- writeConcern:可选参数,定义抛出异常的级别。
eg:
bash
# 创建一些测试数据
db.course.insertMany([
{
title: 'MongoDB教程',
author: '编程帮',
url: 'http://www.biancheng.com/mongodb/index.html'
},{
title: 'HTML教程',
author: '编程帮',
url: 'http://www.biancheng.com/html/index.html'
},{
title: 'C#教程',
author: '编程帮',
url: 'http://www.biancheng.com/csharp/index.html'
}
])
# 删除title为"MongoDB教程"的文档
db.course.deleteOne({'title':'MongoDB教程'})