【MongoDB】MongoDB操作及python中使用MongoDB
【MongoDB】MongoDB操作及python中使用MongoDB
一、Mongodb简介
二、MongoDB的增删改查
三、MongoDB的数据类型
四、MongoDB的关键字及修改器
五、python下使用MongoDB(pyMongo)
一、Mongodb简介
了解MongoDB先了解什么是非关系型数据库(what):
NoSQL,泛指非关系型的数据库。随着互联网web2.0网站的兴起,传统的关系数据库在应付web2.0网站,特别是超大规模和高并发的SNS类型的web2.0纯动态网站已经显得力不从心,暴露了很多难以克服的问题,而非关系型的数据库则由于其本身的特点得到了非常迅速的发展。NoSQL数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,尤其是大数据应用难题。
什么是MongoDB数据库(what):
MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。
MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。
它和我们使用的关系型数据库最大的区别就是约束性,可以说文件型数据库几乎不存在约束性,理论上没有主外键约束,没有存储的数据类型约束等等
关系型数据库中有一个 "表" 的概念,有 "字段" 的概念,有 "数据条目" 的概念
MongoDB中也同样有以上的概念,但是名称发生了一些变化,严格意义上来说,两者的概念即为相似,但又有些出入。
举个例子:
下面我们做一张表:
这是我们用关系型数据库做的一张很简单的User表对吧
接下来我们再看一下MongoDB的数据结构:
这......这特么不就是个列表,里面放着三个字典吗?你说的对,如果你理解成了列表和字典,那么证明了你只会Python,在其他语言中它又是别的类型了,我们把这种类型的玩意儿,叫做:Json
那么你就该恍然大悟了吧,MongoDB的每个表(Collection)中存储的每条数据(Documents)都是一个一个的Json,Json中的每一个字段(Key)我们称之为:Field
就此我们引出了三个关键字,Collection也就是关系型数据库中"表"的概念,Documents就是"数据条目",Field就是"字段"。
二、MongoDB的增删改查
增删改查之前需要先创建一个数据库
1.use+数据库名
MongoDB设计的比较随意,没有就认为你是在创建,use LuffyCity_Com是不存在的,所以MongoDB就认为你是要创建并使用。
!!!后续这个概念一定要记住了:MongoDB中如果你使用了不存在的对象,那么就等于你在创建这个对象!!!
2.切换数据库
3.创建MongoDB中的表Collections
4.查看当前数据库的表
你会发现刚才创建的users表竟然还是查不到,这是因为show tables是查看物理磁盘上的,而不会查看内存等虚拟磁盘上的
【增加数据】
1.insert:插入一条或者多条数据,需要带有允许插入多条的参数,这个方法目前官方已经不推荐喽
db.users.insert({"name":"xujiayu","age":26})
2.insertOne: 插入一条数据,官方推荐
db.users.insertOne({"name":"neymar","age":26})
3.insertMany:插入多条数据,无需参数控制,官方推荐
db.users.insertMany([{"name":"bbb","age":29},{"name":"aaa","age":18}])
我们插入了几条数据后,再show tables看看,这时候数据存在了
【查询数据】
插入完之后当然要查询数据
1.find() 无条件查找:将该表(Collection)中所有的数据一次性返回
db.users.find()
2.db.数据库名.find(对应条件)条件查找:name等于WuSir2b的数据,这里会返回多条结果
db.users.find({"name":"neymar"})
"_id":ObjectId("乱七八糟一道对看着毫无关系的一对字符串") 是什么,我们插入的时候并没有一个字段(Field)并没有_id这个,
这就是MongoDB自动给我们添加到系统唯一标识"_id" 是一个ObjectId 类型,下一章节会介绍到数据类型
3.findOne()无条件查找一条数据,默认当前Collection中的第一条数据
db.users.findOne()
4.findOne(加条件)条件查找一条age等于19的数据,如有多条数据则返回更靠前的数据
db.users.findOne({"age":26})
【修改数据】
查询完数据发现错误要改怎么办
1.update({"name":"DragonFire"},{$set:{"age":21}}):根据条件修改该条数据的内容
意思是把名字是aaa的人的年龄改成2222,如果条件为空,那么将会修改Collection中所有的数据
db.users.update({"name":"aaa"},{$set:{"age":2222}})
2.updateOne({"age":19},{$set:{"name":"WSSB"}}):根据条件修改一条数据的内容,如出现多条,只修改最高前的数据
db.users.updateOne({"name":"aaa"},{$set:{"age":1111}})
3.updateMany({"age":19},{$set:{"name":"pig_qi"}}):根据条件修改所有数据的内容,多条修改
那么我们之前说过MongoDB的灵活性,没有就代表我要创建,所以说如果该条Documents没有name属性,他就会自动创建一个name属性并且赋值为"WSSB"
【删除数据】
改了半天想删除
1.remove({}):无条件删除数据,这里要注意了,这是删除所有数据,清空Collection
db.users.remove({})
2.remove({"name":"aaa"}) : 条件删除name等于"aaa"的所有Document
db.users.remove({"name":"aaa"})
三、MongoDB的数据类型
首先我们要先了解一下MongoDB中有什么样的数据类型:
Object ID :Documents 自生成的 _id
String: 字符串,必须是utf-8
Boolean:布尔值,true 或者false (这里有坑哦~在我们大Python中 True False 首字母大写)
Integer:整数 (Int32 Int64 你们就知道有个Int就行了,一般我们用Int32)
Double:浮点数 (没有float类型,所有小数都是Double)
Arrays:数组或者列表,多个值存储到一个键 (list哦,大Python中的List哦)
Object:如果你学过Python的话,那么这个概念特别好理解,就是Python中的字典,这个数据类型就是字典
Null:空数据类型 , 一个特殊的概念,None Null
Timestamp:时间戳
Date:存储当前日期或时间unix时间格式 (我们一般不用这个Date类型,时间戳可以秒杀一切时间类型)
1.Object ID
"_id" : ObjectId("5b151f8536409809ab2e6b26""_id" : ObjectId("5be7df276a9e57f00fbcea02" #"5b151f85" 代指的是时间戳,这条数据的产生时间 #"364098" 代指某台机器的机器码,存储这条数据时的机器编号 #"09ab" 代指进程ID,多进程存储数据的时候,非常有用的 #"2e6b26" 代指计数器,这里要注意的是,计数器的数字可能会出现重复,不是唯一的 #以上四种标识符拼凑成世界上唯一的ObjectID #只要是支持MongoDB的语言,都会有一个或多个方法,对ObjectID进行转换 #可以得到以上四种信息 #注意:这个类型是不可以被JSON序列化的
0-8字节是时间戳,
9-14字节的机器标识符,表示MongoDB实例所在机器的不同;
15-18字节的进程id,表示相同机器的不同MongoDB进程。
19-24字节是计数器
2.String
UTF-8字符串,记住是UTF-8字符串
3.Boolean
true or false 这里首字母是小写的
4.Integer
整数 (Int32 Int64 你们就知道有个Int就行了,一般我们用Int32)
5.Double
浮点数 (MongoDB中没有float类型,所有小数都是Double)
6.Arrays
{ "_id" : ObjectId("5be7e1d36a9e57f00fbcea06"), "name" : "xujiayu", "age" : 26, "aaa" : true, "salary" : 12000.1, "hobby" : [ "football", "basketball" ] }
7.Object
{ "_id" : ObjectId("5b163915993ddc4cd4918eaf"), "name" : "LuffyCity", "course" : { "name" : "Python", "price" : 19800 } }
8.Null
{ "_id" : ObjectId("5b163a0e993ddc4cd4918eb0"), "name" : "LuffyCity", "course" : null }
空数据类型 , 一个特殊的概念,None Null
9.Timestamp
{ "_id" : ObjectId("5b163bbf993ddc4cd4918eb3"), "name" : "LuffyCity", "date" : 1528183743111 }
10.Date
{ "_id" : ObjectId("5b163ba1993ddc4cd4918eb2"), "name" : "LuffyCity", "date" : ISODate("2018-06-05T15:28:33.705+08:00") }
四、MongoDB的关键字及修改器
1.查询中常见的 等于 大于 小于 大于等于 小于等于
等于 : 在MongoDB中什么字段等于什么值其实就是 " : " 来搞定 比如 "name" : "neymar"
大于 : 在MongoDB中的 大于 > 号 我们用 : $gt 比如 : "score" : { $gt : 80 } 就是 得到 "score" 大于 80 的数据
小于 : 在MongoDB中的 小于 < 号 我们用 : $lt 比如 : "score" : { $lt : 80 } 就是 得到 "score" 小于 80 的数据
大于等于 : 在MongoDB中的 大于等于 >= 号 我们用 : $gte 比如 : "score" : { $gte : 80 } 就是 得到 "score" 大于等于 80 的数据
小于等于 : 在MongoDB中的 小于等于 <= 号 我们用 : $lte 比如 : "score" : { $lte : 80 } 就是 得到 "score" 小于等于 80 的数据
这就是MongoDB中的运算符,是不是很类似我们使用的ORM中的运算符啊,没错,最开始的时候我们就已经说了,MongoDB的操作就是很类似ORM的
关键字
$or : db.users.find({$or:[{age:18},{name:"银网吧"}]})
$and : ,
$in : db.users.find({age:{$in:[18,84,73]}})
$all : db.users.find({hobby:{$all:[1,2,3,4,5,6]}})
2.MongoDB中的那些个update修改器: $inc $set $unset $push $pull
在此前的update中,我们用过$set,对数据进行过更新,其实在update中还存在很多的$关键字,我们把update中的这些关键字叫做 修改器
修改器很多,这里挑一些重要的来说一说:
(1)$inc : Python中的 变量 += 1 , 将查询到的结果 加上某一个值 然后保存
还是刚才Collection数据,我们来试一下$inc , 让工资12000.1的人的工资加1元
如果要减去多少直接加个负号就行{$inc:{"salary":20}}
(2)$set : 此前我们已经提到过 $set 的用法和特性(没有就自动添加一条)了
(3)$unset : 用来删除Key(field)的
(4)$push : 它是用来对Array (list)数据类型进行 增加 新元素的,相当于我们大Python中 list.append() 方法
做一个小例子 :首先我们要先对原有数据增加一个Array类型的field:
使用update $set 的方法只能为Document中的第一条添加
使用updateMany $set 的方法 可以为所有满足条件的 Document 添加 "test_list" , 注意我这里的条件为空 " {} " 就算是为空,也要写上"{}" 记住记住记住
接下来我们就要队列表进行添加了: 将 "score" 为 100 的Document 中"test_list" 添加一个 6
$push 是在 Array(list) 的尾端加入一个新的元素 {$push : {"test_list" : 6}}
(5)$pull : 有了$push 对Array类型进行增加,就一定有办法对其内部进行删减,$pull 就是指定删除Array中的某一个元素
做一个例子: 把我们刚才$push进去的 6 删除掉
问题来了,如果 Array 数据类型中 如果有 多个 6 怎么办呢?
全部删掉了.....
得出了一个结论,只要满足条件,就会将Array中所有满足条件的数据全部清除掉
(6)$pop : 指定删除Array中的第一个 或 最后一个 元素
做个小例子: 删除"score" 等于 100 分 test_list 的最后一个元素
怎么删除第一个呢?
{$pop:{"test_list" : -1}} -1 代表最前面, 1 代表最后边 (这和我们大Python正好相反) 记住哦
$的妙用
在MongoDB中有一个非常神奇的符号 "$"
"$" 在 update 中 加上关键字 就 变成了 修改器
其实 "$" 字符 独立出现也是有意义的 , 我起名叫做代指符
首先看个例子: 还是这个Collection
现在把 "score": 100 的 test_list 里面的 2 改为 9
{$set :{"test_list.0" : 9}} 这样就是对应 Array 中的下标进行修改了 "test_list.下标"
问题来了 如果 是 一个很长很长很长的 Array 你要查找其中一个值,把这个值修改一下怎么整呢?
神奇不神奇?
$ 字符 在语句中代表了什么呢? 下标,位置
解释一下: 首先我们查询一下db.Oldboy.findOne({"score":100,"test_list":3}) 返回 给我们满足条件的数据对吧
那么 如果 我们 使用 update的话, 满足条件的数据下标位置就会传递到 $ 字符中,在我们更新操作的时候就相当于 对这个位置 的元素进行操作
五、python下使用MongoDB(pyMongo)