from pymongo import MongoClient # 实例化 client,建立连接 client=MongoClient(host="127.0.0.1",port=27017) # 自己的电脑上其实可以不写 # 选择test 的数据库,在选t1的集合 collection = client["test"]["t1"] # 插入一条数据: collection.insert({"_id":10,"name":"tangtang","age":10}) # 把上面的传一个等于一个变量会怎么样呢? t=collection.insert({"_id":10,"name":"tangtang","age":10}) # 结果: t=10 ,把它赋值给变量会获取到他的_id # 插入多条数据: data_list=[{"name":i} for i in range(10)] collection.insert_many(data_list) # 查询一条数据 t=collection.find_one({"name":"tangtang"}) print(t) # 查询多条数据, t=collection.find({"name":"tangtang"}) print(t) # 返回的类型是 一个cursor 对象 # 第一次 在用 i 循环的时候会有数据,在用j循环的时候不会有数据,因为,他的游标在后面去了没有数据咯 for i in t: print(i) for j in t: print(j) # 更新一条数据 collection.update_one({"name":"tangtang"},{"$set":{"name":"miaomiao"}}) # 前面是要改的条件,后面是要改的内容 # 全部更新: collection.update_many({"name":"tangtang"},{"$set":{"name":"miaomiao"}}) # 删除一条 collection.delete_one({"name":"tangtang"}) # 删除多条 collection.delete_many({"name":"tangtang"})
Mongodb的基础命令
查看当前的数据库:db 查看所有的数据库:show dbs 或者 show databases 切换数据库:ues db_name(name 是名字 _下划线记得别忘记了)或者 ues +名字 (use tang 使用tang这个数据库) 删除当前的数据库:db.dropDatabase()
不手动动创建集合 可以使用没有的集合,他会自己创建,添加数据集合就建立了 手动创建: db.createCollection(name,options) db.createCollection(集合名字) db.createCollection("",{capped:true,size:10}) 参数capped:默认值为fasle表示不设置上限,值为ture 表示设置上限 参数size:当capped值为ture时,需要指定此参数,表示上限大小,当文档达到上限时,会将之前的数据覆盖,单位为字节 '查看集合:'show collections "删除集合": db.集合名称.drop() "插如集合:"db.集合名称.insert("这里是要插入的东西(字典)") 列如: db.test.insert({"name":"我是小水水啊"}) "显示集合:" db.集合名.find()
db.集合名称.save({ '内容'}) 如果文档的_id已经存在则修改,如果文档的_id不存在就会添加 (插入的时候可以用这个,如果有相同的_id也不会报错了)
假如集合里是: {name:"小红",age:10} db.集合名.update({name:"小红"},{name:"小明"}) ---这个是把有小红的name 替换成小明的name,是整条数据的替换,替换后只有{"name","小明"} 没有其他的数据了 db.集合名.update({name:"小红"},{$set:{name:"小明"}}) ---变成了 {name:"小明",age:10}
假如集合里是: {name:"小红",age:10} {name:"小红",age:11} {name:"小红",age:18} db.集合名.update({name:"小红"},{$set:{name:"小明"}},{multi:true}) multi 必须和 $ 一起用
db.集合名.remove({name:"小红"},{justOne:true}) 这个只删一条数据 db.集合名.remove({name:"小红"}) 默认全部删除
db.集合名.find({age:18}) # 寻找所有age 等于18 的
db.集合名.findone(age:18) # 寻找一个age等于18
db.集合名.findone(age:18).pretty() # 美化PPT
案例
查找年龄小于18的
db.集合名.find({age:{$lte:18}})
使用python "$in","$nin"
判断是否在某个范围内
查询年龄为18,28的学生
db.集合名.find({age:{$in:[18,28]}})
查询在18到28之内的学生
db.集合名.find(age:{$nin:[18,28]})
and : 在json 中写多个条件即可
查询年龄大于等于18,并且性别为true的学生 db.集合名.find({age:{$gte:18},gender:ture})
or :使用$or ,值为数组.数组中的每个元素为json
查询年龄大于18,或性别为false的学生 db.集合名.find({$or:[{age:{$gte:18}},{gender:ture}],name:"郭靖"})
使用 /这里是正则/ 或者regex编写正则表达式
查询姓黄的学生
db.集合名.find({name:/^黄/}) db.集合名find({name:{$regex:^'黄'}})
db.集合名.find({age:18}).limit(2) 只要前两个 db.集合名.find({age:18}) .skip(2) 不要前两个,之后的都要 db.集合名.find({age:18}) .skip(2).limit(2) 联合用
用js 进行查询
使用$where后面写一个函数,返回满足条件的数据查询年龄大于30的学生
db.集合名.find({ $where:function(){ return this.age>30} } {name:1,age:1} 这里要注意 这个只显示了name和age )
db.集合名.find({ $where:function(){ return this.age>30} } ) 这个显示所有
方法sort()
, 用于对 集进行排序db.集合名.find().sort({字段:1})
“参数1为升序排列”
“参数-1位降序排列”
根据性别降序,在根据年龄升序
db.集合名.find().sort({gender:-1,age:1})
db.集合名.find({条件}).count() db.集合名.count(条件)
db.集合名.find({条件},{name:1,_id:0})
_id
默认会显示_id
之外其他的字段,如果不显示,不写,不能写为0db.集合名.distinct("字段":{条件})
----- 返回一个列表 里面是不重复的字段
db.集合名.distinct("age":{age:{$gt:10}})
在age里面找大于10岁不重复的
备份语法;
mongodump -h 服务器 -d 数据库名 -o 路径
如果是本机上的 不需要 -h
,-d
.
数据的恢复 :
mongorestore -h 恢复到那个服务器 -d 恢复到那个数据库 -dir 恢复到那个位置
聚合(aggregate)是基于数据处理的聚合管道,每个文档通过一个由多个阶段(stage)组成的管道,可以对每个阶段的管道进行分组、过滤等功能,然后经过一系列的处理,输出相应的结果。
db.集合名称.aggregate({管道:{表达式)
在mongodb中,文档处理完毕后,通过管道进行下一次处理常用管道如下:
''' $group:将集合中的文档分组,可用于统计结果 $match:过滤数据,只输出符合条件的文档 $project:修改输入文档的结构,如重命名、增加、删除字段、创建计算结果 $sort:将输入文档排序后输出 $limit:限制聚合管道返回的文档数 $skig:跳过指定数量的文档,并返回余下的文档$unwind:将数组类型的字段进行拆分 '''
表达式
处理输入文档并输出语法:表达式:
$列名'常用表达式: $sum:计算总和,$sum:1表示以一倍计数$avg:计算平均值 $min:获取最小值 $max:获取最大值 $push:在结果文档中插入值到一个数组中 $first:根据资源文档的排序获取第一个文档数据 $last:根据资源文档的排序获取最后一个文档数据
如果 _id 为null 就是全部成为一组
可用多个$group
进行分组
db.集合名.aggregate( {$group:{}} {$group:{}} )
按性别分组:
db.集合名.aggregate( {$group:{_id:"$gender"}} ) 结果:{_id:男} {_id:女}
按性别分组并且计数
db.集合名.aggregate( {$group:{_id:"$gender",count:{$sum:1}}} ) sum 是指一个算一个,如果是sum 是2, 一个算两个
按性别分组,算出平均年龄:
db.集合名.aggregate( {$group:{_id:"$gender",avg_age:{$avg:"$age"}}} ) 结果: {_id:男,avg_age:18} {_id:女,avg_age:16}
改变_id 的显示:
db.集合名.aggregate( {$group:{_id:"$gender",avg_age:{$avg:"$age"}}}, {$project:{gender:"_id",avg_age:"$avg_age"}} 取的上一个管道里面的数据 ) 结果 {gender:男,avg_age:18} {gender:女,avg_age:16}
过滤数据:
去重
可以 把所有的字段放到group里面分组就可以去重复了
-$group
对应的字典中有几个键,结果中就有几个键
分组依据需要放到_id
后面
取不同的字段的值需要使用$
, $gender
, $age
取字典嵌套的字典中的值的时候$_id. country
用点(.)
能够同时按照多个键进行分组{$group:{_id:{country:"$country" , province:"$province"}}}
结果是:{_id:{country: " ",province:" "}}
这时候就用点访问 里面的数据! 在进行选择