aoi学院

Aisaka's Blog, School of Aoi, Aisaka University

MongoDB-基本操作

基本操作

mongod

  • 打开或者新建一个数据库dir
1
2
3
4
PS C:\Users\16218> mongod --install --dbpath=D:/mongodb-win32-x86_64-windows-4.4.2/data --logpath=D:/mongodb-win32-x86_64-windows-4.4.2/logs/mongodb.log
PS C:\Users\16218> net start mongodb

PS C:\Users\16218> mongod --config "D:\mongodb-win32-x86_64-windows-4.4.2\mongo.conf"
  • 周边语法
1
2
3
4
PS C:\Users\16218> bin/mongod.exe --install --dbpath 磁盘路径 --logpath 日志路径        // 创建服务
PS C:\Users\16218> bin/mongod.exe --remove // 删除服务
PS C:\Users\16218> net start mongodb // 启动服务
PS C:\Users\16218> net stop mongodb // 关闭服务

mongoimport

  • –db 导入到那个库

  • –collection 导入到哪个集合

  • –drop 加上就表示清空原有文档

  • –file 要导入的文件

1
PS C:\Users\16218> mongoimport --db test --collection user --drop --file dir

mongo

数据库(查看、创建、选择、删除)

查看:show databases

创建:有单独的语法 但是忽略 隐式创建

选择:use 数据库名

删除:1.通过use选中数据库 2.通过db.dropDatabase()删除数据库

集合(查看、创建、删除)

查看:show collextions

创建:db.createCollection(‘集合名’) 多学一招:忽略 后期插入数据 隐式创建集合

删除:db.集合名.drop()

C插入文档

语法:db.集合名.insert(JSON数据)

说明:集合存在 则直接插入数据 集合不存在 则隐式创建

练习:在test2数据库的c1集合中插入数据(姓名叫webopenfather年龄18岁)

1
2
3
4
5
> use test2
> db.c1.insert({uname: "webopenfather", age: 18})

留心1:数据库和集合不存在都隐式创建
留心2:对象的键统一不加引号方便看,但是查看集合数据时系统会自动加

思考1:是否可以自定义_id值?

回答:可以,只需要给插入的JSON数据增加_id键即可覆盖(但实战强烈不推荐)

1
> db.c1.insert({_id: 1, uname: "webopenfather", age: 18})

思考2:如何一次性插入多条记录?

回答:传递数据,数组中写一个个JSON数据即可

1
2
3
4
5
> db.c1.insert([
{uname: "a", age: 1},
{uname: "b", age: 2},
{uname: "c", age: 3},
])

思考3:如何快速插入10条数据?

回答:mongodb底层使用JS引擎实现的,所以支持部分js语法,因此可以写for循环

1
2
3
4
> use test2
> for (let i = 1; i <= 10; i++) {
db.c2.insert({uname: "a"+i, age: i})
}

R查询文档

语法:db.集合名.find(条件 [,查询的列])

1
2
3
4
5
6
7
8
9
10
条件
查询所有数据 {}或者不写
查询age=6的数据 {age: 6}
既要age=6又要性别=男 {age: 6, sex: '男'}

查询的列(可选参数)
不写 只查询全部列(字段)
{age: 1} 只显示age列(字段)
{age: 0} 除了age列(字段都显示)
留心:不管怎么写 系统自定义的_id都会存在

升级语法:db.集合名.find({键: {运算符: 值}})

说明:

运算符作用
$gt大于
$gte大于等于
$lt小于
$lte小于等于
$ne不等于
$inin
$ninnot in

练习1:查询所有数据

1
> db.c1.find()

练习2:查询年龄大于5岁的数据

1
> db.c1.find({age: {$gt: 5}})

练习3:查询年龄是5岁、8岁、10岁的数据

1
> db.c1.find({age: {$in: [5, 8, 10]}})

练习4:只看年龄列,或者年龄以外的列(_id别管它)

1
2
> db.c1.find({}, {age: 1})
> db.c1.find({}, {age: 0})

U修改文档

语法:db.集合名.update(条件, 新数据 [,是否新增,是否修改多条])

1
2
是否新增:指条件匹配不到数据则插入 true插入 false不插入(默认)
是否修改多条:指将匹配成功的数据都修改 true修改多条 false不修改多条(默认)

升级语法:db.集合名.update(条件, {修改器: {键: 值}})

说明:

运算符作用
$inc递增
$rename重命名列
$set修改列值
$unset删除列

练习1:将{uname: “zc1”}改为{uname: “zc2”}

1
2
> db.c3.update({uname: "zc1"}, {uname: "zc2"})              // 这是替换
> db.c3.update({uname: "zc1"}, {$set: {uname: "zc2"}}) // 这是修改

练习2:给{uname: “zc10”}的年龄加2岁或减两岁

1
2
> db.c3.update({uname: "zc1"}, {$inc: {age: 2}})
> db.c3.update({uname: "zc1"}, {$inc: {age: -2}})

练习3:修改器综合练习

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
uname改成zc2
> db.c3.update({uname: "zc1"}, {$set: {uname: "zc2"}})
age增加111
> db.c3.update({uname: "zc2"}, {$inc: {age: 111}})
who改字段sex
> db.c3.update({uname: "zc2"}, {$rename: {who: "sex"}})
other删除
> db.c3.update({uname: "zc2"}, {$unset: {other: true}})
或者一起写
db.c3.update({uname: "zc1"}, {
$set: {uname: "zc2"},
$inc: {age: 111},
$rename: {who: "sex"},
$unset: {other: true},
})

D删除文档

语法:db.集合名.remove(条件, [,是否删除一条])

注意:是否删除一条 true是 false否(默认)

1
2
> db.c3.remove({}, true)
> db.c3.remove({})

小总结

增Create

1
> db.集合名.insert(JSON数据)

删Delete

1
> db.集合名.remove(条件, [,是否删除一条])

改Update

1
2
> db.集合名.update(条件, 新数据 [,是否新增,是否修改多条])
> db.集合名.update(条件, {修改器: {键: 值}})

查Read

1
> db.集合名.find(条件 [,查询的列])

排序

语法:db.集合名.find().sort(JSON数据)

说明:键 就是要排序的列/字段 值 1升序 -1降序

练习1:年龄升序&降序

1
2
> db.c1.find().sort({age: 1})
> db.c1.find().sort({age: -1})

练习2:按照k1来排序 如果k1的值相同 按照k2来排序 1升序 -1降序

1
> db.collectionName.find().sort({k1: 1}, {k2: -1})

Limit与Skip方法

语法:db.集合名.find().sort().skip(数字).limit(数字)

说明:skip跳过指定数量(可选),limit限制查询的数量

练习1:降序查询2条

1
> db.c1.find().sort({age: -1}).skip(0).limit(2)

练习2:降序跳过2条并查询2条

1
> db.c1.find().sort({age: -1}).skip(2).limit(2)

实战分页

需求:数据库 1 - 10 数据,每页显示2条(5页)

语法:db.集合名.find().skip().limit(2)

skip计算公式:(当前页 - 1) * 每页显示条数

聚合查询

语法:

1
2
3
4
> db.集合名称.aggregate([
{管道: {表达式}}
...
])

常用管道:

1
2
3
4
5
6
$group  将集合中的文档分组,用于统计结果
$match 过滤数据,只要输出符合条件的文档
$sort 聚合数据进一步排序
$skip 跳过指定文档数
$limit 限制集合数据返回文档数
...

常用表达式:

1
2
3
4
5
$sum    总和 $sum:1同count表示统计
$avg 平均
$min 最小值
$max 最大值
...

练习1:统计男生、女生的总年龄

1
2
3
4
5
6
7
8
> db.集合名称.aggregate([
{
$group: {
_id: "$sex",
rs: {$sum: "$age"}
}
}
])

练习2:统计男生、女生的总人数

1
2
3
4
5
6
7
8
> db.集合名称.aggregate([
{
$group: {
_id: "$sex",
rs: {$sum: 1}
}
}
])

练习3:求学生总数和平均年龄

1
2
3
4
5
6
7
8
9
> db.集合名称.aggregate([
{
$group: {
_id: null,
total_num: {$sum: 1},
total_avg: {$avg: "$age"}
}
}
])

练习4:查询男生、女生人数,按人数升序

1
2
3
4
5
6
7
8
9
10
11
> db.集合名称.aggregate([
{
$group: {
_id: "$sex",
rs: {$sum: 1}
}
},
{
$sort: {rs: 1}
}
])

Linux环境安装MongoDB

  • 下载
1
[root@VM-8-3-centos ~]# wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-4.4.2.tgz
  • 解压
1
[root@VM-8-3-centos ~]# tar -zxvf mongodb-linux-x86_64-rhel70-4.4.2.tgz
  • 将解压包拷贝到指定目录
1
[root@VM-8-3-centos ~]# mv mongodb-linux-x86_64-rhel70-4.4.2/ /usr/local/mongodb
  • 创建数据存放目录与日志存放目录
1
[root@VM-8-3-centos ~]# mkdir -p /usr/local/mongodb/data /usr/local/mongodb/logs
  • 启动MongoDB服务
1
[root@VM-8-3-centos ~]# /usr/local/mongodb/bin/mongod --dbpath=/usr/local/mongodb/data --logpath=/usr/local/mongodb/logs/mongodb.log --logappend --port=27017 --fork
  • 后期登录即可
1
[root@VM-8-3-centos ~]# /usr/local/mongodb/bin/mongo