mongo(无关系型文档数据库)

匿名 (未验证) 提交于 2019-12-02 22:59:29

第一天

MongoDB (芒果数据库)

数据存储阶段

优点 : 数据可以长期保存



缺点 :数据一致性差

数据库管理阶段

优点 : 数据组织结构化,降低了冗余


缺点 : 数据库的使用专业性较强,相对比较复杂

几个概念

数据 : 能够输入到计算机中并被识别处理的信息的集合
数据结构 :研究组成数据集合中数据之间关系的学科
数据库 : 按照数据结构,存储管理数据的仓库。

数据管理系统 : 数据管理软件,用于维护管理数据库

关系型数据库

采用关系模型来组织数据结构的数据库 (二维表)

优点 : 容易理解,逻辑类似常见的表格


缺点 : 每次操作都需要SQL语句解析,消耗较大


优点 : 高并发,读写能力强

缺点 : 通用性差,没有sql那样统一的操作语句

Nosql的使用情况
1. 数据的一致性要求低
2. 处理数据的海量并发
3. 数据库大小不容易确定,需要分布扩展
4. 给定的数据结构建立非关系模型更加容易


列存储数据库

图形数据库

MongoDB数据库 (非关系型数据库 ---》 文档型数据库)

1. 由c++编写的数据库管理系统
2. 支持丰富的增删改查功能
3. 支持丰富的数据类型

5. 在NoSql 中技术相对比较成熟

Mongodb 安装

自动安装
sudo apt-get install mongodb




手动安装

1. 下载合适版本的mongodb


3. 将文件夹下bin文件夹加入到环境变量





4. 重启系统


Mongodb命令

设置数据库端口

* 默认27017

mongodb的交互模式,用于操作mongodb数据库


mongodb数据库组成结构

--------------------------

--------------------------

--------------------------

--------------------------

{



},
{



}

概念对比


创建数据库



* 只有向数据库中插入数据时数据库才会被真实创建出来,而use后不会马上创建


查看数据库
show dbs

系统数据库


config : 存储分片信息

数据库的命名规则
1. 使用utf-8字符

3. 长度不能超过64字节
4. 不能和系统数据库重名

* 习惯上使用小写字母,表达数据库的含义



数据库的备份和恢复


mongodump -h 127.0.0.1 -d stu -o bak



数据库的监测命令

mongostat





监测每个数据读写时长



删除数据库
db.dropDatabase()
删除db所代表的数据库


db.createCollection(collection_name)

e.g. 创建一个叫class1的集合
db.createCollection('class1')

创建集合2

当向一个集合中插入数据的时候,如果这个集合不存在则自动创建

db.collection.insert(...)


db.class2.insert({"name":"Lucy","age":18})

查看集合

show collections
show tables

集合的命名规则:



删除集合

db.collection.drop()



集合重命名

db.collection.renameCollection("new_name")



文档

mongodb中数据的组织形式 ---》 文档

mongodb文档 : 以键值对的形式组成的类似于字典的数据结构结合。

键 : 即文档的域

命名规则
1. utf-8 格式字串
2. 不能有'\0'
3. 一个文档中的键不能重复

* 文档中键值对是有序的
* mongodb严格区分大小写

值 : 即文档存储数据,也就是mongodb支持的数据类型















ObjectId

"_id" : ObjectId("5b764646d4ff0ad8f415f977")


集合中的文档
* 集合中的文档不一定域的个数相同
* 集合中的文档不一定有相同的域
(关系型数据库: 表决定字段,mongodb中 文档决定域)


集合设计原则
1. 集合中的文档应该尽可能描述同一类内容。有更多相同的域
2. 同一类数据信息,不要过多分散集合存放
3. 集合中文档的层次不要包含太多


插入文档

db.collection.insert()

插入单个文档

e.g.
db.class0.insert({'name':"Lucy","age":18})
db.class0.insert({name:"Tom",age:17,sex:'m'})




插入多条文档

db.collection.insert([{},{},{}])


db.class1.insert([{name:'阿宝',age:33,sex:'m'},{name:'阿蓉',age:27,sex:'w'},{name:'阿哲',age:32,sex:'m'}])

save 插入文档

db.collection.save()


db.class0.save({name:'Davil',age:16,sex:'m'})
db.class1.save([{name:'小白',age:30,sex:'w'},{name:'小陈',age:34,sex:'m'}])

* 如果不适用_id则save用法同insert一样
* 如果加_id项,此时文档已经存在时则会替换原有文档


获取集合对象
db.getCollection("collection")
===> db.collection

e.g.
db.getCollection("class1").insert({name:'老王',age:'36'})

查找操作

find(query,field)
功能 : 查找数据


返回值 : 返回查找到的文档

query : 以键值对的形式给出查找条件

field : 以键值对的形式给出要展示(不展示的域)

* 如果使用0设置某些域不显示则默认其他域显示

* _id 只有设置为0才不显示否则默认显示
* 除_id域,其他域必须同时设置为0或者1
* 如果不写该参数则表示显示所有内容


db.class1.find({sex:'m'},{_id:0,name:1,age:1})

findOne(query,field)
功能 : 查找符合条件的第一条文档
参数: 同find
返回值 : 查找到的文档



query更丰富用法

比较操作符


db.class0.find({age:{$eq:17}},{_id:0})

e.g.
db.class0.find({name:{$lt:"Tom"}},{_id:0})

* 字符串也可以比较大小

e.g.
db.class0.find({age:{$lte:17}},{_id:0})


db.class0.find({age:{$gt:17}},{_id:0})


db.class0.find({age:{$gte:17}},{_id:0})

db.class0.find({age:{$ne:17}},{_id:0})



db.class0.find({age:{$in:[16,18]}},{_id:0})


db.class0.find({age:{$nin:[16,17]}},{_id:0})


逻辑操作符

* query 中如果多个条件用逗号隔开即为and关系


年龄为17 并且为 男
db.class0.find({age:17,sex:'m'},{_id:0})
年龄大于13并且小于18
db.class0.find({age:{$gt:13,$lt:18}},{_id:0})

使用 $and


db.class0.find({$and:[{age:17},{sex:'m'}]},{_id:0})

$or 逻辑或


db.class1.find({$or:[{age:{$gt:30}},{sex:'w'}]},{_id:0})

年龄不等于17
db.class0.find({age:{$not:{$eq:17}}},{_id:0})



db.class0.find({$nor:[{age:17},{sex:'m'}]},{_id:0})

条件混合
(年龄大于30 并且叫阿宝) 或者 性别为 w

db.class1.find({$or:[{age:{$gt:30},name:'阿宝'},{sex:'w'}]},{_id:0})


db.class1.find({$or:[{age:{$lt:30}},{age:{$gt:33}}],sex:'w'},{_id:0})

数组

表达 : 使用中括号将一定的数据组织成一种数据结构

* 数组中的数据类型可以不同
* 数组是有序的



通过数组中元素的个数查找


db.class2.find({score:{$size:2}},{_id:0})


查找数组中同时包含多项的文档

e.g. 数组中同时包含88和90
db.class2.find({score:{$all:[88,90]}},{_id:0})

$slice
取数组的部分进行显示,在field中声明




其他query查询

$exists
判断一个域是否存在

e.g. 查找有sex域的文档(true表示存在,false表示不存在)


余数查找


db.class0.find({age:{$mod:[2,1]}},{_id:0})

$type
数据类型查找

e.g. 查找age值类型是1的
db.class1.find({age:{$type:1}},{_id:0})

操作符用法文档查找
www.mongodb.com ---> docs ---->search


查找结果的进一步操作

distinct()
功能 : 查看集合中某个域的取值范围


pretty()
功能 : 将查询结果格式化显示


limit(n)
功能 : 显示查找结果的前n条文档


db.class1.find({},{_id:0}).limit(3)

skip(n)
功能 : 跳过前n条显示后面的内容


count()
功能 : 计数统计

e.g. 统计查找数量
db.class1.find({},{_id:0}).count()


sort({field:1/-1})
功能 : 对查找结果排序
参数 : 以键值对形式给出,键表示按照哪个域排序


db.class1.find({},{_id:0}).sort({age:1})

复合排序: 当第一排序项相同的时候按照第二排序项排序,以此类推


db.class0.find({},{_id:0}).sort({age:1,name:1})

函数的连续调用

当一个函数的返回结果仍然是文档集合的时候可以连续调用函数


db.class1.find({},{_id:0}).sort({age:1}).limit(3)


文档的删除操作

remove(query,justOne)
功能 : 删除文档






db.class0.remove({age:17},true)


删除一个集合中所有文档
db.collection.remove({})


db.class0.remove({})

查找操作

find(query,field)
功能 : 查找数据


返回值 : 返回查找到的文档

query : 以键值对的形式给出查找条件

field : 以键值对的形式给出要展示(不展示的域)

* 如果使用0设置某些域不显示则默认其他域显示

* _id 只有设置为0才不显示否则默认显示
* 除_id域,其他域必须同时设置为0或者1
* 如果不写该参数则表示显示所有内容


db.class1.find({sex:'m'},{_id:0,name:1,age:1})

findOne(query,field)
功能 : 查找符合条件的第一条文档
参数: 同find
返回值 : 查找到的文档



query更丰富用法

比较操作符


db.class0.find({age:{$eq:17}},{_id:0})

e.g.
db.class0.find({name:{$lt:"Tom"}},{_id:0})

* 字符串也可以比较大小

e.g.
db.class0.find({age:{$lte:17}},{_id:0})


db.class0.find({age:{$gt:17}},{_id:0})


db.class0.find({age:{$gte:17}},{_id:0})

db.class0.find({age:{$ne:17}},{_id:0})



db.class0.find({age:{$in:[16,18]}},{_id:0})


db.class0.find({age:{$nin:[16,17]}},{_id:0})


逻辑操作符

* query 中如果多个条件用逗号隔开即为and关系


年龄为17 并且为 男
db.class0.find({age:17,sex:'m'},{_id:0})
年龄大于13并且小于18
db.class0.find({age:{$gt:13,$lt:18}},{_id:0})

使用 $and


db.class0.find({$and:[{age:17},{sex:'m'}]},{_id:0})

$or 逻辑或


db.class1.find({$or:[{age:{$gt:30}},{sex:'w'}]},{_id:0})

年龄不等于17
db.class0.find({age:{$not:{$eq:17}}},{_id:0})



db.class0.find({$nor:[{age:17},{sex:'m'}]},{_id:0})

条件混合
(年龄大于30 并且叫阿宝) 或者 性别为 w

db.class1.find({$or:[{age:{$gt:30},name:'阿宝'},{sex:'w'}]},{_id:0})


db.class1.find({$or:[{age:{$lt:30}},{age:{$gt:33}}],sex:'w'},{_id:0})

数组

表达 : 使用中括号将一定的数据组织成一种数据结构

* 数组中的数据类型可以不同
* 数组是有序的



通过数组中元素的个数查找


db.class2.find({score:{$size:2}},{_id:0})


查找数组中同时包含多项的文档

e.g. 数组中同时包含88和90
db.class2.find({score:{$all:[88,90]}},{_id:0})

$slice
取数组的部分进行显示,在field中声明




其他query查询

$exists
判断一个域是否存在

e.g. 查找有sex域的文档(true表示存在,false表示不存在)


余数查找


db.class0.find({age:{$mod:[2,1]}},{_id:0})

$type
数据类型查找

e.g. 查找age值类型是1的
db.class1.find({age:{$type:1}},{_id:0})

操作符用法文档查找
www.mongodb.com ---> docs ---->search


查找结果的进一步操作

distinct()
功能 : 查看集合中某个域的取值范围


pretty()
功能 : 将查询结果格式化显示


limit(n)
功能 : 显示查找结果的前n条文档


db.class1.find({},{_id:0}).limit(3)

skip(n)
功能 : 跳过前n条显示后面的内容


count()
功能 : 计数统计

e.g. 统计查找数量
db.class1.find({},{_id:0}).count()


sort({field:1/-1})
功能 : 对查找结果排序
参数 : 以键值对形式给出,键表示按照哪个域排序


db.class1.find({},{_id:0}).sort({age:1})

复合排序: 当第一排序项相同的时候按照第二排序项排序,以此类推


db.class0.find({},{_id:0}).sort({age:1,name:1})

函数的连续调用

当一个函数的返回结果仍然是文档集合的时候可以连续调用函数


db.class1.find({},{_id:0}).sort({age:1}).limit(3)


文档的删除操作

remove(query,justOne)
功能 : 删除文档






db.class0.remove({age:17},true)


删除一个集合中所有文档
db.collection.remove({})


db.class0.remove({})

修改操作符的使用

$set
修改一个域的值,增加一个域


db.class1.update({name:'阿哲'},{$set:{age:33}})


db.class1.update({name:'阿蓉'},{$set:{sex:'w'}})


$unset
删除一个域


db.class1.update({name:'小陈'},{$unset:{sex:''}})

* 每个操作符可以同时操作多项
e.g.
db.class1.update({name:'陈'},{$set:{age:36,sex:'m'}})

* 一次修改可以同时使用多个操作符
e.g.
db.class1.update({name:'阿宝'},{$set:{name:'老王'},$unset:{sex:''}})

$rename
修改域名


db.class1.update({sex:{$exists:true}},{$rename:{sex:'gender'}},false,true)

$setOnInsert
如果第三个参数为true且插入数据,则表示插入文档的补充内容。如果不插入文档则不起作用


db.class1.update({name:'阿文'},{$set:{age:32},$setOnInsert:{gender:'m'}},true)

$inc
加减修改器

e.g.
db.class1.update({},{$inc:{age:-1}},false,true)

$mul
乘法修改器

e.g.
db.class2.update({},{$mul:{age:2}},false,true)


如果筛选文档指定域的值小于min值则不修改,大于min值则修改为min值


db.class2.update({},{$min:{age:18}},false,true)

$max
如果筛选文档指定域的值大于max值则不修改,小于max值则修改为max值


db.class1.update({},{$max:{age:30}},false,true)


数组修改器


db.class2.update({name:'小亮'},{$push:{score:91}})

db.class2.update({name:'小明'},{$pushAll:{score:[5,10]}})

e.g.
db.class2.update({name:'小明'},{$pull:{score:10}})


db.class2.update({name:'小明'},{$pullAll:{score:[58,5]}})


e.g.
db.class2.update({name:'小明'},{$push:{score:{$each:[60,10]}}})




db.class2.update({name:'小明'},{$push:{score:{$each:[],$sort:1}}})


db.class2.update({name:'小明'},{$pop:{score:-1}})


db.class2.update({name:'小红'},{$addToSet:{score:80}})

时间类型

mongodb 中支持时间格式 : ISODate()

1. 使用new Date() 自动生成当前时间
e.g.

2. 使用 ISODate() 生成当前时间
e.g. db.class0.insert({book:'Python精通',date:ISODate()})

3. 获取计算机时间生成时间格式字符串 Date()

db.class0.insert({book:'Python疯狂',date:Date()})

指定时间:

ISODate()
功能: 生成mongodb时间存储类型
参数: 不加参数生成当前时间





db.class0.insert({book:'Python崩溃',date:ISODate("2018-07-13 11:23:36")})

时间戳

通过当前的时间生成的一个时间节点标志

valueOf()
生成某个标准时间的时间戳

e.g.
db.class0.insert({book:'Python重生',date:ISODate().valueOf()})


Null 类型

1. 如果某个域存在却没有值可以设置为null


db.class0.insert({book:'Python编程',date:null})

2. 在查找时可以找到值为null或者不存在某个域的文档


数组的下标操作方式


db.class2.find({'score.0':{$gt:90}},{_id:0})


db.class2.update({name:'小红'},{$set:{'score.1':10}})


文档内部某个域的值还是一个文档,则这个文档称为内部文档类型数据

e.g.
db.class3.find({'books.title':'狂人日记'},{_id:0})

e.g.
db.class3.update({"books.title":'骆驼祥子'},{$set:{"books.price":48.6}})


查找结果的下标引用

可以通过下标的方式获取查找结果的某一项


db.class1.find({},{_id:0})[2]

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!