mongodb的简单操作
mongodb的安装与启动
链接: https://my.oschina.net/u/2417992/blog/3053325
mongodb中数据库和集合的命令
-
数据库不需要提前创建,插入数据时自动创建
show dbs
查看所有的数据库- use 数据库名 # 使用数据库
- 数据库名.dropDatabase() # 删除数据库
-
集合不需要提前创建,插入数据时自动创建
- show collections # 查看所有集合
-
db.集合名.drop() # 删除集合
- db.集合名.find() # 查看集合中的所有数据
-
db.集合名.find({条件}) # 查询特定条件的数据
插入数据(insert和save的区别)
- db.集合名.insert() # 插入数据,_id重复会报错
- db.集合名.save() # 如果_id存在则更新,如果不存在则插入新数据
更新数据
- db.集合名.update({KaTeX parse error: Expected 'EOF', got '}' at position 14: set:{需要修改的数据}}̲)`db.jarvis.upd…set{age:1}})`将age修改为1
db.jarvis.update({name:1023},{$set:{age:1}},{multi:true})
多行修改
删除数据
- db.集合名.remove({条件}, {justOne:true}) # 设置justOne参数删除一条数据
- db.集合名.remove({条件}) # 默认删除所有符合条件的数据
比较运算符
db.stu.insert([{"name":"郭靖","hometown":"蒙古","age":20,"gender":true},{"name":"黄蓉","hometown":"桃花岛","age":18,"gender":false},{"name":"华筝","hometown":"蒙古","age":18,"gender":false},{"name":"黄药师","hometown":"桃花岛","age":40,"gender":true},{"name":"段誉","hometown":"大理","age":16,"gender":true},{"name":"段王爷","hometown":"大理","age":45,"gender":true},{"name":"洪七公","hometown":"华山","age":81,"gender":true}])
- 小于:查询年龄小于20岁的人:
db.stu.find({"age":{$lt:20}})
- 小于等于:查询年龄小于等于20的人
db.stu.find({"age":{$lte:20}})
- 大于:查询年龄大于20的人:
db.stu.find({"age":{$gt:20}})
- 不等于:查询年龄不等于20的人
db.stu.find({"age":{$ne:20}})
逻辑运算符
- 与:直接写多个条件,查询年龄不等于20且家乡是蒙古的
db.stu.find({"age":{$ne:20},hometown:"蒙古"})
- 或:使用KaTeX parse error: Expected '}', got 'EOF' at end of input: …组`db.stu.find({or:[{“age”:{$lt:20}},{hometown:“蒙古”}]})`
范围查询
- KaTeX parse error: Expected '}', got 'EOF' at end of input: …ind({hometown:{in:[“蒙古”,“桃花岛”]}}`
- KaTeX parse error: Expected '}', got 'EOF' at end of input: …ind({hometown:{nin:[“蒙古”,“桃花岛”]}})`
正则匹配
db.pro.insert([{stu:"abc123",tea:"jarvis"},{stu:"abc456",tea:"wu"},{stu:"xyz123",tea:"zhangsan"}])
- 使用/ /:
db.pro.find({stu:/^abc/})
查找stu的值以abc开头的数据,db.pro.find({stu:/123$/})
查找stu的值以123结尾的所有数据
skip和limit
- 方法limit():用于读取指定数量的文档
db.stu.find().limit(3)
:限制读取三条数据 - 方法skip():用于跳过指定数量的文档
db.stu.find().skip(3)
:跳过前三条数据 - 同时使用:一般先使用skip()再使用limit()可以效率更快
db.stu.find().skip(1).limit(2)
:跳过一条数据再读取两条数据
排序
方法sort(),用于对集合排序,参数1为升序,参数-1为降序
db.stu.find().sort({age:1,gender:-1})
:按照年龄升序,性别降序进行排序,先按年龄排序,再按性别排序
统计个数
方法count(),用于查询包含指定条件的元素出现的次数
- 查询集合中元素的总数
db.stu.count()
- 查询年龄大于等于18的元素:
db.stu.count({age:{$gte:18}})
去重
方法distinct(),返回一个数组
- 查询所有人的hometown是哪些地方:
db.stu.distinct("hometown")
- 查询年龄大于18的人的hometwon:
db.stu.distinct("hometown",{age:{$gt:18}})
投影
显示指定的字段的内容
- 查询所有人的姓名:
db.stu.find({},{name:1})
参数值为1表示true,0表示false - 查询所有人的姓名,不包含_id
db.stu.find({}, {name:1,__id:0})
- 查询年龄大于18的人的姓名:
db.stu.find({age:{$gt:18}},{name:1})
mongodb管道命令
mongodb的常用管道和表达式
管道命令
- $group:将集合中的文档分组,可用于统计结果
- $match:过滤数据,只输出符合条件的文档
- $project:修改输入文档的结构,如重命名、增加、删除字段、创建计算结果
- $sort:将输入文档排序后输出
- $limit:限制聚合 管道返回的文档数
- $skip:跳过指定数量的文档,并返回余下的文档
常用表达式
- s u m : 计 算 总 和 , sum:计算总和, sum:计算总和,sum:1 表示以一倍计数
- $avg:计算平均值
- $min:获取最小值
- $max:获取最大值
- $push:在结果文档中插入值到一个数组中
管道命令之$group
求以hometown分组的元素个数,总年龄以及平均年龄
db.stu.aggregate({$group:{_id:"$hometown",count:{$sum:1},total_age:{$sum:"$age"},avg_age:{$avg:"$age"}}})
- _id: 分组的依据
- $age: 取age对应的值
- $sum:1 : 把每条数据作为1进行统计,统计的是个数
- s u m : " sum:" sum:"age": 统计年龄对应的和
- $group : 对应的字典中的键是输出数据的键
不分组,求整个文档中各个数据的情况
db.stu.aggregate({$group:{_id:null,count:{$sum:1},total_age:{$sum:"$age"},avg_age:{$avg:"$age"}}})
统计整个文档
-
数据透视(把不同行的数据放到一行来展示)
db.stu.aggregate({$group:{_id:"$gender",name:{$push:"$name"},hometown:{$push:"$hometown"}}})
管道命令之$match
在管道中过滤数据
- 统计年龄大于18的人的年龄
db.stu.aggregate({$match:{age:{$gt:18}}},{$group:{_id:"$age"}})
管道命令之$project
输出自己想要了解的字段
-
输出所有的name对应的值,不输出_id
db.stu.aggregate({$project:{name:1,_id:0}})
$skip $limit $sort
s o r t 排 序 、 sort排序、 sort排序、skip跳过、$limit限制
db.stu.aggregate(
{$group:{_id:"$hometown",count:{$sum:1}}},
{$sort:{count:-1}},
{$skip:1},
{$limit:2})
mongodb的索引与备份
mongodb创建索引的方法
- 语法:
- db.集合名.createIndex({属性:1}) , 1表示升序,-1表示降序
- 具体操作:
db.t255.createIndex({name:1})
创建索引前后查询速度对比
测试:插入10万条数据到数据库中
for(i=0;i<100000;i++){db.t255.insert({name:'test'+i,age:i})}
创建索引前:
db.t255.find({name:'test100000'})
db.t255.find({name:'test100000'}).explain('executionStats')
创建索引后:
db.t255.createIndex({name:1})
db.t255.find({name:'test100000'}).exlain('executionStats')
索引查看
默认情况下,_id是集合的索引
查看方式:db.t255.getIndexes()
mongodb创建唯一索引
在默认情况下mongodb的索引字段的值是可以相同的,仅仅能够提高查询速度,不能保证数据的唯一性,添加唯一索引的语法:
db.t255.createIndex({name:1},{unique:true})
mongodb的备份和恢复
-
备份的语法:
mongodump -h dbhost -d dbname -o dbdirectory
- -h:服务器地址,也可以指定端口号
- -d:需要备份的数据库名称
- -o:备份的数据存放位置,此目录中存放着备份出来的数据
-
示例:
mongodump -h 192.168.196.128:27017 -d test1 -o ~/Desktop/test1bak
-
恢复的语法:
mongorestore -h dbhost -d dbname --dir dbdirectory
- -h:服务器地址
- -d:需要恢复的数据库实例
- –dir:备份数据所在的位置
-
示例:
mongorestore -h 192.168.128:27017 -d test2 --dir ~/Desktop/test1bak/test1
pymongo的使用
-
安装:
pip install pymongo
-
建立连接:
from pymongo import MongoClient # 建立和MongoDB的链接 client = MongoClient(host='服务器ip', port=27017) collection = client['test100']['t1'] # 插入一条数据 collection.insert_one({"name":10086,"age":20})
-
插入一条数据:
isnert_one
-
插入多条数据:
insert_many
-
删除一条数据:
delete one
-
删除多条数据:
delete many
-
修改一条数据:
update_one
-
修改多条数据:
update_many
-
查找一条数据:
find_oen
-
查找多条数据:
find