【MongoDB】MongoDB操做及python中使用MongoDBhtml
1、Mongodb简介python
2、MongoDB的增删改查web
3、MongoDB的数据类型数据库
4、MongoDB的关键字及修改器数组
5、python下使用MongoDB(pyMongo)数据结构
1、Mongodb简介并发
了解MongoDB先了解什么是非关系型数据库(what):app
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就是"字段"。
2、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"})
3、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") }
4、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的话, 知足条件的数据下标位置就会传递到 $ 字符中,在咱们更新操做的时候就至关于 对这个位置 的元素进行操做
5、python下使用MongoDB(pyMongo)