【MogoDb】MogoDb数据库初识
一、MongoDB简介
1.1概念
MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。
MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。
1.2与关系型数据库的区别
它和我们使用的关系型数据库最大的区别就是约束性,可以说文件型数据库几乎不存在约束性,理论上没有主外键约束,没有存储的数据类型约束等等。关系型数据库中有一个 "表" 的概念,有 "字段" 的概念,有 "数据条目" 的概念。MongoDB中也同样有以上的概念,但是名称发生了一些变化,严格意义上来说,两者的概念即为相似,但又有些出入,不过无所谓,我们就当是以上概念就好啦。
1.3图解数据库表结构
MongoDB的每个表(Collection)中存储的每条数据(Documents)都是一个一个的Json,Json中的每一个字段(Key)我们称之为:Field
就此我们引出了三个关键字,Collection也就是关系型数据库中"表"的概念,Documents就是"数据条目",Field就是"字段"
二、MongoDB安装部署
1、安装包的下载
https://www.mongodb.com/
products---->SOFRWARE---->Mogodb Server---->Download the latest release---->server---->选择版本、安装包、系统进行下载
2、安装 一直next
custom # 自定义安装
3、配置
D:\software\mogodb\bin #我的环境变量
3、新建文件夹
D:\software\mogodb\data\db #不写会报错,路径随便写
4、启动客户端
mongod --dbpath D:\software\mogodb\data\db
5、服务端登录
mongo
三、数据库的操作
MongoDB中如果你使用了不存在的对象,那么就等于你在创建这个对象哦
3.1表的操作
db -- 当前使用的数据库 查看名称,代指当前使用的数据库
show databases -- 查看当前服务器磁盘上的所有数据库
use dbname -- 切换当前使用的数据库 或者在内存中创建一个新的数据库 赋值给 db
show tables -- 查看当前数据库中所有磁盘中的表
db.tablename -- 使用当前数据库中的tablename表 在内存中创建表
3.2数据的增、删改查操作
1、增加 insert
insert:
插入一条数据:
db.book.insert({name:'三国演义'}) #插入数据,field可以不加引号,以后少用
db.book.insertOne({name:'三国演义'})#推荐 必须写字典,
插入多条数据
db.book.insert([{name:'睡觉',age:'19'},{"anmial":"dog"}])#以后少用
db.book.insertMany([{name:'睡觉',age:'19'},{"anmial":"dog"}]) #推荐,必须是列表套字典
2、删除
#官方不推荐
db.book.remove({}) #无条件删除数据,这里要注意了,这是删除所有数据,清空Collection
db.book.remove({name:'三国演义'})
#官方推荐:
3.2
db.tablename.deleteOne() # 删除符合条件的第一条数据
db.tablename.deleteMany() # 删除所有符合条件的数据
3、改 update
#语法
db.book.update({},{$set:{"price":21}}) #查询条件的结果多条,默认修改第一条
db.book.updateOne({},{$set:{"price":21}}) #推荐
db.book.updateMany({name:'睡觉'},{$set:{"price":30}}) #查询条件的结果多条,修改多条没有price就会创建一个price字段
4、查 find
db.book.find() #无条件查找:将该表(Collection)中所有的数据一次性返回
#3.2之后加入的
db.book.findOne() #无条件查找一条数据,默认数据库的第一条数据 返回值是json
db.book.findOne({age:'19'}) #查找一条age等于19的数据,如有多条数据则返回更靠前的数据
四、关键字及修改器
4.1数学比较符
1、大于gt
db.student.find({age:{$gt:21}})
2、大于等于gte
db.student.find({age:{$gte:21}})
3、小于lt
db.student.find({age:{$lt:21}})
4、小于等于lte
db.student.find({age:{$lte:21}})
5、等于
db.student.find({age:21})
db.student.find({age:{$eq:21}})
6、不等于
db.student.find({age:{$ne:21}})
4.2与update相关的装饰器
1、$inc 变量+1
db.student.update({name:"小兰"},{$inc:{age:20}})#自增值可以自己设定
2、.$set 没有就自动添加一条
db.student.update({name:"小兰"},{$set:{hobby:'hj'}})
3、$unset 用来删除Key(field)的
db.student.update({name:"小兰"},{$unset:{age:1}})
4、push 、pushAll
它是用来对Array (list)数据类型进行 增加 新元素的,相当于我们大Python中 list.append() 方法
db.student.update({name:"小兰"},{$set:{arry:[]}})
db.student.update({name:"小兰"},{$push:{arry:555}})
db.student.update({name:"小兰"},{$pushAll:{arry:[555,22,33]}})#迭代添加
5、pull、pullAll
$pull 就是指定删除Array中的某一个元素,如果多个条件满足,全部删除
db.student.update({name:"小兰"},{$pull:{arry:222}})
db.student.update({name:"小兰"},{$pullAll:{arry:[555,33]}})#迭代删除
6、pop
指定删除Array中的第一个 或 最后一个 元素
db.student.update({name:"小兰"},{$pop:{arry:1}}) #删除最后一个
db.student.update({name:"小兰"},{$pop:{arry:-1}}) #删除第一个
4.3$的特殊用法
db.student.update({name:"小兰"},{$set:{"arry.1":50}}) #,"arry.1"加引号
db.student.update({name:"小兰",arry:3333},{$set:{"arry.$":80}}) #将3333改成了80
4.4 and、or、all、in
1、and 并列查询
db.student.find({name:"小兰",age:30})
db.student.find({$and:[{name:"小兰"},{age:"30"}]})
2、或条件查询
db.student.find({$or:[{name:"小兰"},{age:30}]})
3、子集查询$all
db.student.find({"arry":{$all:[111,50,80]}})#只要arry包含[111,50,80]就可以找到
4、范围查找
db.student.find({name:{$in:["小明","小兰"]}})
五、Array Object的特殊操作
1、实例一
1、数据准备
db.student.insert(
{
"name" : "雷人",
"price" : [
19800,
19500,
19000,
18800
],
"other" : {
"start" : "2018年8月1日",
"start_time" : "08:30",
"count" : 150
}
})
2、把price 中 19000 改为 19300
db.student.update({name:'雷人',price:19000},{$set:{"price.$":500}})
2、混合用法
db.student.update({name:"雷人","price.2":{$lt:1000}},{$inc:{"price.$":500}})
#price.2的值小于1000,将会自动加上500
3、把other中 count 改为 199
db.student.update({name:"雷人"},{$set:{"other.count":199}})
4混合用法
db.student.update({name:"雷人","other.count":{$lt:200}},{$inc:{"other.count":1}})
2、实例二
1、数据准备
db.student.insert({
"_id" : ObjectId("5b17de9d44280738145722b9"),
"name" : "火箭队",
"price" : [
{
"start" : "2018年8月1日",
"start_time" : "08:30",
"count" : 150
},
{
"start" : "2018年8月2日",
"start_time" : "09:30",
"count" : 160
},
{
"start" : "2018年8月3日",
"start_time" : "10:30",
"count" : 170
},
{
"start" : "2018年8月4日",
"start_time" : "11:30",
"count" : 180
}
]
})
2、把count 大于 175 的field 加 15
db.student.update({name:"火箭队",'price.count':{$lt:175}},{$inc:{'price.$.count':15}})
3、把 count 大于 180 的 start 改为 "2018年8月10日"
db.student.updateMany({name:"火箭队",'price.count':{$gt:175}},{$inc:{'price.$.starttime':"2018年9月13日"}})
#只更改第一个
代码解析:
{"price.count":{$gt:175}}, price 明明是个 Array 啊 怎么就直接 打点儿 count 了呢 这里要知道price 打点儿 就是从内部的Object 中找到 count 小于 175 的结果
{$inc:{"price.$.count":15}} , 这里就比较好理解了,price里面第 $ (大于175的第一个) 个元素中 count 增加 15
补充:
$只能存储一个下表
六、limit sort skip
1、limit/sort/skip的简单用法
db.student.find().limit(2) # 取前2条
db.student.find().skip(2) #跳过前2条
db.student.find().sort({"age":1}) #排序从小到大,-1从大到小
2、两两组合用法
db.student.find().limit(2).skip(1)
db.student.find().skip(1).limit(2)
#以上两中用法的结果是等效的
3、limit sort skip三者组合用法
db.student.find().skip(1).limit(2).sort({age:1})
#Sort + Skip + Limit 是有执行优先级的 他们的界别分别是 优先 Sort 其次 Skip 最后limit
#Limt Skip + Limit 的优先级 也是先 Skip 再 Limit