本文简单介绍了 mongodb 数据库的基本概念以及基础用法
一、简介
MongoDB
是为快速开发互联网Web
应用而设计的数据库系统MongoDB
的设计目标是极简、灵活、作为Web
应用栈的一部分MongoDB
的数据模型是面向文档的,所谓文档,是一种类似于JSON
的结构,简单理解MongoDB
这个数据库中存的是各种各样的JSON(BJSON)
二、相关概念及名词
数据库:是一个仓库,在仓库中可以存放集合
集合
- 类似于数组,在集合中可以存放文档
- 存储的文档可以是多种多样的,没有格式要求
文档
- 数据库中的最小单位,对数据库进行存储和操作的内容都是文档
- 类似于
JS
中的对象,在MongoDB
中每一条数据就是一个文档
多个文档组成集合,多个集合组成数据库
三、常用指令
基本指令
show dbs/ databases
: 显示当前的所有数据库use
数据库名:进入到指定的数据库中eg: use my_test
db
:表示的是当前所处的数据库show collections
:显示数据库中所有的集合
增删改查(CRUD)指令
新增(INSERT)
向数据库中插入文档:
db.<collection>.insert(doc)
- 向集合中插入一个或多个文档
- 向集合中插入文档时,如果没有给文档指定
id
属性,则数据库会自动为文档添加_id
,该属性用来作为文档的唯一标识 _id
我们可以自己指定,如果我们指定了,则数据库就不会再自动生成了。如果自己指定_id
,也必须确保它的唯一性- 例子:向
test
数据库中的students
集合中插入一个新的学生对象:{name: "小明", age: 18, addr: "male"}
1
2use test;
db.students.insert({name: "小明", age: 18, addr: "三味书屋"});
db.<collection>.insertOne(doc)
:向数据库中插入一条数据db.<collection>.insertMany(doc)
:向数据库中插入多条数据
示例:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15use test;
// 插入一条
db.students.insert({name: "小明", age: 18, addr: "三味书屋", salary: 3000});
// 插入多条
db.students.insert([{name: "小红", age: 16, addr: "东方明珠", salary: 5000}, {name: "小白", age: 19, addr: "王府井", salary: 6000}]);
// 等同于下面的方式
// 插入一条
db.students.insertOne({name: "小明", age: 18, addr: "三味书屋", salary: 3000});
// 插入多条
db.students.insertMany([{name: "小红", age: 16, addr: "东方明珠", salary: 5000}, {name: "小白", age: 19, addr: "王府井", salary: 6000}]);
查询(QUERY)
db.<collection>.find()
- 默认查询当前集合中的所有文档
find({})
:也是查询当前集合中所有的文档- 返回的是一个数组
- 接收一个对象作为参数,必须满足对象中所有的属性
.count()
: 查询出所有结果的数量.length()
: 查询出所有结果的数量
db.<collection>.findOne()
:查询集合中符合条件的第一个文档- 返回的是一个对象
1 | use test |
投影
db.<collection>.find(filter, options)
filter
:查询条件对象options
: 投影条件对象,需要展示的属性设置为 1,不需要展示的属性设置为 0
.limit(num)
:显示多少个文档.skip(num)
:跳过多少个文档.sort({ key1: 1, key2: -1 })
:按照key1
正序排列,排完之后再按照key2
倒序排列
示例1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19use test;
// 查询 students 集合中所有对象,只展示 age 字段
db.students.find({}, { age: 1 });
// 查询 students 集合中所有对象,不展示 age 字段
db.students.find({}, { age: 0 });
// 查询 students 集合,只展示符合条件的前 2 条数据
db.students.find({}).limit(2);
// 查询 students 集合中所有对象,跳过前 2 条数据
db.students.find({}).skip(2);
// 查询 students 集合中所有对象,按 age 正序排列
db.students.find({}).sort({ age: 1 });
// 查询 students 集合中所有对象,按 age 倒序排列
db.students.find({}).sort({ age: -1 });
常用查询器
$gt
:大于$gte
:大于等于$eq
:等于$lt
:小于$lte
:小于等于$or
:或者
之前查询不使用任何查询器时,条件的判断是包含,不是相等
示例:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20// 工资大于 3000
db.students.find({salary: { $gt: 3000 }});
// 工资大于等于 3000
db.students.find({salary: { $gte: 3000 }});
// 工资等于 3000
db.students.find({salary: { $eq: 3000 }});
// 工资小于 6000
db.students.find({salary: { $lt: 6000 }});
// 工资小于等于 6000
db.students.find({salary: { $lte: 6000 }});
// 工资大于 3000 且小于 6000
db.students.find({salary: { $gt: 3000, $lt: 6000 }});
// 工资是 3000 或者 名字是 小白
db.students.find({$or: [ {salary: 3000}, {name: "小白"} ]});
更新(UPDATE)
db.<collection>.update(查询条件, 新对象, [options])
options
: 配置对象upsert: <boolean>
multi: <boolean>
是否跟新多条,默认是 falsewriteConcern: <document>
collation: <document>
update()
默认情况下会使用新对象来替换旧的对象- 如果需要修改指定的属性,而不是替换,则需要使用 “修改操作符” 来完成
$set
: 修改操作符,修改属性值。$unset
: 修改操作符,删除属性值。- db.
.update({ name: “zgd” }, {$set: { age: 21 }})
- db.
- 默认情况下只会更新匹配到的第一个文档对象
- db.
.updateOne(查询条件, 新对象):修改第一个符合条件的文档 - db.
.updateMany(查询条件, 新对象):同时修改多个符合条件的文档 - db.
.replaceOne(查询条件, 新对象):替换一个文档
示例1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19use test
// 修改一条数据
db.students.update({name: '小明'}, {$set: { age: 19 }});
// 等同于 updateOne
db.students.updateOne({name: '小明'}, {$set: { age: 19 }});
// 修改多条数据
db.students.update({age: 19}, {$set: { addr: '水月洞天' }}, { multi: true });
// 等同于 updateMany
db.students.updateMany({age: 19}, {$set: { addr: '水月洞天' }});
// 数据替换
db.students.update({age: 16}, { name: '小花', age: 14, addr: '迪士尼乐园' });
// 等同于 replaceOne
db.students.replaceOne({age: 16}, { name: '小花', age: 14, addr: '迪士尼乐园' });
常用修改器:
$set
: 设置属性$unset
:删除属性$push
:向数组中添加一条数据$addToSet
:向数组中添加一条数据,与$push
的区别:若数据已存在,则不再添加$inc
(只能用于 Number 类型的值):用来增加已有属性的值,若属性不存在,则创建该属性
1 | // 修改 addr 属性 |
删除(DELETE)
db.<collection>.remove(查询条件, [justone]])
- 默认删除所有符合条件的文档
- 不传查询对象会报错
- 如果传递一个空对象
{}
作为参数,则会删除集合中的所有数据。使用这种方式清空集合性能较差 justone
:<boolean>
默认是false
,设置为true
,则只会删除匹配到的第一个文档
db.<collection>.deleteOne(查询条件)
:删除匹配到的第一个文档db.<collection>.deleteMany(查询条件)
:删除匹配到的所有文档
示例1
2
3
4
5
6
7
8
9
10
11
12
13
14// 删除一条
db.students.remove({ name: '小花' }, true);
// 等同于 deleteOne
db.students.deleteOne({ name: '小花' });
// 删除多条
db.students.remove({ age: '19' });
// 等同于
db.students.deleteMany({ age: '19' });
// 删除所有数据(不建议使用这种方式清空数据,速度较慢)
db.students.deleteMany({});
删除集合和数据库
db.<collection>.drop()
: 删除集合db.dropDatabase()
:删除数据库
示例1
2
3
4
5// 删除 students 集合(建议使用这种方式清空数据,速度较快)
db.students.drop();
// 删除当前数据库
db.dropDatabase();