mongoDB简介
mongodb属于nosql数据库的一种,是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。在高负载的情况下,添加更多的节点,可以保证服务器性能。
nosql的含义为不仅仅是sql,通常用于超大规模数据的存储,这些类型的数据存储不需要固定的模式,无需多余操作就可以横向扩展。也就是说在mongodb中没有行的概念,使用的是key-value来保存数据,这使得数据建模和应用程序编程更加简单,扩展也更加容易。
安装mongodb的repo源
vi /etc/yum.repos.d/mongodb3.6.repo
[mongodb3.6]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/3.6/x86_64/
gpgcheck=0
enabled=1
yum -y install mongodb-org
启动mongodb
systemctl start mongodb
netstat -lnpt //查看端口
ps aux | grep mongodb //查看进程号
管理mongodb
SQL术语/概念 | MongoDB术语/概念 | 解释/说明 |
---|---|---|
database | database | 数据库 |
table | collection | 数据库表/集合 |
row | document | 数据记录行/文档 |
column | field | 数据字段/域 |
index | index | 索引 |
table joins | 表连接,MongoDB不支持 | |
primary | keyprimary key | 主键,MongoDB自动将_id字段设置为主键 |
数据库操作
#####查看数据库
show dbs # 列出所有数据库
db # 查看当前使用的数据库
创建数据库
use mydb //创建数据库
db.myset.insertOne({name:"zhao"}) //再创建文档时创建数据库
删除数据库
db.dropDatabase() //删除数据库
数据集合操作
查看集合
show collections //查看集合
show tables //查看集合
创建集合
db.createCollection("myset") //创建集合
删除集合
db.myset.drop() //删除集合
文档操作
创建文档
直接操作
db.myset.insertOne({"name":"wang","age":"18"}) //创建文档
db.myset.insertMany([{"name":"xiu","age":"18“},{"name":"yu","age":"16"}]) //创建多个文档
先定义后插入
human=({"name":"xiuxiu","age":"14"}) //先定义一个文件名再插入一个文档(human可以随便定义)
db.myset.insertOne(human) //输入定义的名字(human)插入数据
human=([{"name":"wangwang","age":"10"},{"name":"yuyu","age":"12"}]) //先定义一个文件名再插入多个文档(human可以随便定义)
db.myset.insertMany(human) //输入定义的名字(human)插入数据
简单查看文档
查找全部
加.pretty()以详细方式显示
db.myset.find()
db.myset.find().pretty()
匹配查找
db.myset.find({"name":"wangwang"}).pretty() //查找条件name是wangwang的
and查找
db.myset.find({"name":"wangwang","age":"12"}).pretty() //两个条件都满足
or查找
db.myset.find({$or:[{"age":"12"},{"name":"wangwang"}]}).pretty() //满足一个条件
and和or联合使用
db.myset.find({"age":{$gt:1},$or:[{"age":12},{"name":"wangwang"}]}).pretty()
数据库进阶操作查看
条件操作符
db.myset.find({"age":{$gt:2}}).pretty() //$gt 大于
db.myset.find({"age":{$lt:2}}).pretty() //$lt 小于
db.myset.find({"age":{$gte:2}}).pretty() //$gte 大于等于
db.myset.find({"age":{$lte:2}}).pretty() //$lte 小于等于
模糊查询
db.myset.find({name:/u/}) //查询 name 包含"u"字的文档
db.myset.find({name:/^y/}) //查询 name 包含"^y"字开头的文档
db.myset.find({name:/u$/}) //查询 name 包含"u$"字结尾的文档
type类型查询
类型 | 数字 |
---|---|
Double | 1 |
String | 2 |
Object | 3 |
Array | 4 |
Binary data | 5 |
Object id | 7 |
Boolean | 8 |
Date | 9 |
Null | 10 |
Regular Expression | 11 |
JavaScript | 13 |
Symbol | 14 |
JavaScript (with scope) | 15 |
32-bit integer | 16 |
Timestamp | 17 |
64-bit integer | 18 |
Min key | 255 |
Max key | 127 |
db.myset.find({"name" : {$type : 2}})
db.myset.find({"name" : {$type : 'string'}})
Limit方法
limit的意思是从头查找
db.myset.fing().limit
db.myset.find({"name":"yu"}).limit(2) //从头查找两个name:"yu"
Skip方法
skip的意思是跳过几个
db.myset.find()
db.myset.find().limit(2).skip(1) //跳过第一个显示第二个和第三个
db.myset.find({"name":"yu"}).limit(2).skip(1)
sort方法
db.myset.find({},{_id:0,"name":0}).sort({"age":-1})
db.myset.find({},{_id:0,}).sort({"age":-1})
db.myset.find({}).sort({"age":-1})
索引操作
Parameter | Type | Description |
---|---|---|
background | Boolean | 建索引过程会阻塞其它数据库操作,background可指定以后台方式创建索引,默认值为false |
unique | Boolean | 建立的索引是否唯一,指定为true创建唯一索引,默认值为false |
name | string | 索引的名称,如果未指定,MongoDB的通过连接索引的字段名和排序顺序生成一个索引名称 |
sparse | Boolean | 对文档中不存在的字段数据不启用索引,这个参数需要特别注意,如果设置为true的话,在索引字段中不会查询出不包含对应字段的文档,默认值为false |
expireAfterSeconds | integer | 指定一个以秒为单位的数值,完成 TTL设定,设定集合的生存时间 |
weights | document | 索引权重值,数值在1到99,999之间,表示该索引相对于其他索引字段的得分权重 |
default_language | string | 对于文本索引该参数决定了停用词及词干和词器的规则的列表,默认为英语 |
language_override | string | 对于文本索引,该参数指定了包含在文档中的字段名,语言覆盖默认的language,默认值为language |
db.myset.createIndex({"name":1},{background:true}) //创建索引
db.myset.getIndexes() //查看集合索引
db.myset.totalIndexSize() //查看集合索引大小
db.myset.dropIndexes() //删除集合所有索引
db.myset.dropIndex("索引名称") //删除集合指定索引
聚合函数
表达式 | 描述 |
---|---|
$sum | 计算总和 |
$avg | 计算平均值 |
$min | 获取集合中所有文档对应值得最小值 |
$max | 获取集合中所有文档对应值得最大值 |
$push | 在结果文档中插入值到一个数组中 |
$addToSet | 在结果文档中插入值到一个数组中,但不创建副本 |
$first | 根据资源文档的排序获取第一个文档数据 |
$last | 根据资源文档的排序获取最后一个文档数据 |
- 计算总和
db.myset.aggregate([{$group:{_id:"$name",age_sum:{$sum:1}}}])
db.myset.aggregate([{$group:{_id:null,age_sum:{$sum:""}}}])
- 计算平均值
db.myset.aggregate([{$group:{_id:"$name",avg_age:{$avg:"$age"}}}])
- 获取集合中所有文档对应值得最小值
db.myset.aggregate([{$group:{_id:"$name",min_age:{$min:"$age"}}}])
- 获取集合中所有文档对应值得最大值
db.myset.aggregate([{$group:{_id:"$name",max_age:{$max:"$age"}}}])
- 在结果文档中插入值到一个数组中
db.myset.aggregate([{$group:{_id:"$name",age:{$push: "$age"}}}])
- 在结果文档中插入值到一个数组中,但不创建副本
db.myset.aggregate([{$group:{_id:"$name",age:{$addToSet :"$age"}}}])
- 根据资源文档的排序获取第一个文档数据
db.myset.aggregate([{$group:{_id:"$name",first_age:{$first:"$age"}}}])
- 根据资源文档的排序获取最后一个文档数据
db.myset.aggregate([{$group:{_id:"$name",last_age:{$last:"$age"}}}])
管道操作符
- $project:修改输入文档的结构。可以用来重命名、增加或删除域,也可以用于创建计算结果以及嵌套文档。
db.myset.aggregate({$project:{_id:0,name1:"$name"}});
- match:用于过滤数据,只输出符合条件的文档。match使用MongoDB的标准查询操作。
db.myset.aggregate([{$match:{age:{$gt:16,$lte:19}}},{$group:{_id:null,count:{$sum:1}}}]);
- $limit:用来限制MongoDB聚合管道返回的文档数。
db.myset.aggregate([{$limit:10},{$match:{age:{$gt:16,$lte:19}}},{$group:{_id:null,count:{$sum:1}}}]);
- $skip:在聚合管道中跳过指定数量的文档,并返回余下的文档。
db.myset.aggregate([{$limit:10},{$skip:2},{$match:{age:{$gt:16,$lte:19}}},{$group:{_id:null,count:{$sum:1}}}]);
- $group:将集合中的文档分组,可用于统计结果。
db.myset.aggregate({$group:{_id:null,count:{$sum:1}}});
- $sort:将输入文档排序后输出。
db.myset.aggregate({$sort:{age:1}});
修改文档
直接修改
db.myset.update({"name":"xiuxiu"},{$set:{"name":"wangwang"}}) //第一个name是数据库有的,第二个name是你要改的
db.myset.update({"age":"14"},{$set:{"age":"6"}},{multi:true}) //第一个name是数据库有的,第二个name是你要改的
先定义后修改
human=({
"_id" : ObjectId("5c3473ea0229544ae1b89c6f"),
"name" : "gege",
"age" : "8"
}) //与上面一样
db.myset.save(human)
如有报错用下面的
db.myset.save(
human,
{
writeConcern: human
}
)
删除文档
db.myset.deleteMany({}) //删除全部文档但保存集合
匹配删除
db.myset.deleteOne({"name":"wang"}) //删除一个
db.myset.deleteMany({"name":"wang"}) //删除多个