引子
1.mysql 用户表
id name age gender
1 alexDSB 73 Null ## MySQL的第一条记录
2 YWB 84 男 ## MySQL的第二条记录
2.MongoDB 用户表:(##与MySQL存储的对比)
{ ## MongoDB的第一条记录-->是字典,是json,是object(不同的数据类型中不同的叫法)
id:1,
name:alexDSB,
age:73,
gender:Null
},
{ ## MongoDB的第二条记录
id:2,
name:YWB,
age:84,
gender:男
}
学习
下载安装
主角登场:
##下载安装包: 官网 https://www.mongodb.com/download-center/community
压缩包 https://fastdl.mongodb.org/osx/mongodb-osx-ssl-x86_64-3.4.22.tgz
选择3.4版本,因为一直以来用的都是3.4的,其他的没学,不会(现在最新版本已经到4.2了,大版本3和4的最大差别是3不支持事务,4支持事务,事务是什么意思呢?有提交和回滚,执行时候在内存中执行,成功了校验,校验完成提交,校验失败,回滚不提交)
下载完成安装(或者直接解压)
配置环境变量: 通常是将 Bin目录(包含mongod.exe 和 mongo.exe这两个文件的目录)配置到系统环境变量
MongoDB的默认服务端口为 27017 - redis:6379 mysql:3306
1.启动MongoDB服务 - mongod ##直接这样写要先创建数据库的存放目录 C:/data/db/
mongod --help ##查看帮助信息
选项 --dbpath D:/data/db/ ##手动指定数据库存放路径
--install ##安装windows服务,会开机自启动(会拖慢开机速度),使用这个可以不将bin配置到环境变量(还是推荐配置环境变量)
--remove ##卸载windows服务
2.客户端的连接
(1)使用mongodb自带的客户端 - mongo
show databases # 查看本地磁盘上的数据库 结果是admin/local
use dbname # 切换当前使用的数据库 eg:use local
db # 查看当前使用的数据库 结果是local
show tables # 查看当前数据库存放在磁盘上的数据表 结果是startup_log
use 不存在的数据库 # 创建了数据库,当前创建的数据库没有存放在磁盘中(在内存中),所以 show databases 不显示. eg:use adminn
db.不存在的表名 # 创建数据表,当前数据表没有存放在磁盘中(在内存中),所以 show tables 不显示. eg:db.users 结果是adminn.users
? 怎么存放在磁盘中 - 如果表里有数据的话,就在磁盘上了 √
概念 - 使用了不存在的对象即创建该对象
- 不限制数据结构
(2)使用第三方客户端 图形化 - NoSQLBooster4MongoDB (for windows / for mac /for Linux) ##默认安装到数据库存放路径所在的盘符
下载地址 https://nosqlbooster.com/downloads
使用
3.增删改查
(1)增加数据:插入数据(insert insertOne insertMany)
db.tablename.insert({"key":"value"}) 捎带手将库和表写入到磁盘 eg:db.users.insert({"name":"DragonFire","age":20})
官方推荐写法:
db.users.insertOne({"name":"DragonFire","age":20})
db.users.insertMany([{"name":"DragonFire","age":20},{"name":"DragonFire1","age":20},{"name":"DragonFire2","age":20}])
(2)查询数据:查询数据(find findOne) 之 这里没有findMany
db.tablename.find() 无条件查找,查询符合条件的所有数据 #相当于select * from table
db.tablename.find({"name":"AlexDSB"}) 条件查找:name等于AlexDSB的数据,这里会返回多条结果 #相当于select * from table where name=AlexDSB
db.tablename.findOne() 无条件查找一条数据,默认当前Collection中的第一条数据 #相当于limit1
db.tablename.findOne({"age":20}) 查询符合条件的第一条数据:条件查找age等于19的第一条数据,如有多条数据则返回更靠前的数据
(3)修改数据:修改数据(update updateOne updateMany)
db.tablename.update({"name":"AlexDSB"},{"$set":{"age":84}}) 只修改符合条件的一条数据:根据条件修改该条数据的内容,把name等于DragonFire中的age改为21,这里要注意的是({"条件"},{"关键字":{"修改内容"}}),其中如果条件为空,那么将会修改Collection中所有的数据
$set - set修改器 强制替换覆盖
官方推荐写法
db.tablename.updateOne({"age":19},{$set:{"name":"WSSB"}}) 更新符合条件的第一条数据
db.tablename.updateMany({"age":19},{$set:{"name":"pig_qi"}}) 更新符合条件的所有数据
array+Object : db.users.updateOne({"cours.name":"装X"},{$set:{"cours.$.score":"000"}})
(4)删除数据:
db.tablename.remove({}) 无条件删除数据,这里要注意了,这是删除所有数据,清空Collection
db.tablename.remove({age:73}) 条件删除所有age==73的数据
官方推荐写法
db.users.deleteOne() 删除符合条件的第一条数据
db.users.deleteMany() 删除符合条件的所有数据
4.数据类型:
ObjectId :Documents 自动生成的 _id
_id:ObjectId("5cb69a23815ea7295f8bad43") 自动生成的 json数据中不包含ObjectId类型 id类型uuid
String: 字符串,必须是utf-8
Boolean:布尔值,true 或者false (这里有坑哦~在我们大Python中 True False 首字母大写)
Integer:整数 (Int32 Int64 你们就知道有个Int就行了,一般我们用Int32)
Double:浮点数 (没有float类型,所有小数都是Double)
Arrays:数组或者列表,多个值存储到一个键 (list哦,大Python中的List哦)
Object:深度<=4 如果你学过Python的话,那么这个概念特别好理解,就是Python中的字典,这个数据类型就是字典
Null:空数据类型 , 一个特殊的概念,None Null
Timestamp:时间戳 通常不用这个数据类型 如果存储时间 Double
Date:存储当前日期或时间unix时间格式 (我们一般不用这个Date类型,时间戳可以秒杀一切时间类型)
"""
##我加上的
"_id" : ObjectId("5b151f8536409809ab2e6b26")
#"5b151f85" 代指的是时间戳,这条数据的产生时间
#"364098" 代指某台机器的机器码,存储这条数据时的机器编号
#"09ab" 代指进程ID,多进程存储数据的时候,非常有用的
#"2e6b26" 代指计数器,这里要注意的是,计数器的数字可能会出现重复,不是唯一的
#以上四种标识符拼凑成世界上唯一的ObjectID
#只要是支持MongoDB的语言,都会有一个或多个方法,对ObjectID进行转换
#可以得到以上四种信息
#注意:这个类型是不可以被JSON序列化的
这是MongoDB生成的类似关系型DB表主键的唯一key,具体由24个字节组成:
0-8字节是时间戳,
9-14字节的机器标识符,表示MongoDB实例所在机器的不同;
15-18字节的进程id,表示相同机器的不同MongoDB进程。
19-24字节是计数器
"""
5.数学比较符:
$lt : 小于 √
$lte: 小于等于 √
$gt : 大于 √
$gte: 大于等于 √
$ne : 不等于 ##notequal
$eq or 冒号 : 等于
6.查询关键字:
Array(##数组,Python中的列表)数据类型会自动遍历
$in 或者等于相同字段 db.users.find({age:{$in:[19,109]}})
$or 或者等于不同字段 db.users.find({$or:[{age:19},{age:84}]})
$and or 逗号 并列条件
$all - Array 数据类型 子集查询 db.users.find({hobby:{$all: ["罗玉凤"]}})
7.$字符特殊用法:
存储符合条件的元素下标索引
用于修改字段
8.修改器:
$set - set修改器 强制替换覆盖(我:没有就增加键值对)
$unset - 强制删除字段
$inc - 引用增加
array操作:
$push append 在array中追加 db.users.update({name:"AlexDSB"},{$push:{hobby:"特斯垃圾"}})
$pushAll extend 在array中追加列表中的所有元素 db.users.update({name:"AlexDSB"},{$pushAll:{hobby:["22寸轮毂","V8","欧林斯"]}})
$pull remove 在array中删除一个元素 db.users.update({name:"AlexDSB"},{$pull: {hobby:"V8"}})
$pullAll 在array中删除一堆元素 db.users.update({name:"AlexDSB"},{$pullAll: {hobby:["小敏","芙蓉姐姐"]}})
$pop pop 删除第一个 -1 或最后一个 1 的值 db.users.update({name:"AlexDSB"},{$pop: {hobby:1}})
9.skip sort limit
sort 排序
db.users.find({}).sort({ age:1 })
db.users.find({}).sort({ age:1 , birthday:-1 })
limit(1) 选取条目
db.users.find({}).limit(3000)
skip(1) 跳过
db.users.find({}).skip(1)
跳过选取
db.users.find({}).skip(2).limit(3)
先排序 再跳过 最后筛选
db.users.find({}).limit(3).skip(2).sort({ age:-1 })
分页:
(page-1)*num
db.users.find({}).limit(num).skip((page-1)*num)
10.pymongo
11.MongoDB偷换的概念
MySql MongoDB
DataBase == DataBase 库
Table == Collection 表
Colunm == Field 字段
Row == Documents 记录