MongoDB命令基础操作及pymongo模块

启动MongoDB服务
	net start MongoDB
关闭MongoDB服务
	net stop MongoDB
启动本地客户端
	mongo
使用数据库
	use db_name
创建日期语句
	new Date("2020-05-29")
手动创建集合,向不存在的集合中添加数据时,集合会被创建出来
	db.createCollection(name,options)
插入数据
	b.test100.insert({"name":"xiaowang","age":23})
插入数据:如果_id 存在就更新数据
	db.test100.save({_id:102102,name:'xiaogang',age:40})
删除当前数据库
	b.dropDatabase()
删除集合
	b.集合名称.drop()
删除数据,默认删除多条
	db.test100.remove({name:'xiaozhao'})
只删除一条数据
	db.test100.remove({name:'xiaogang'},{justOne:true})
查看当前数据库
	db
查看所有数据库
	show dbs | show databases
查看集合
	show collections
查询数据
	b.test100.find()
查询所有符合条件的数据,并美化输出
	db.test100.find({age:23}).pretty()
查询符合条件的一条数据
	db.test100.findOne({age:23})
比较运算符
小于等于18的{$lte:18}
	db.test100.find({age:{$lte:18}})
	db.test100.find({$where:function(){return this.age<=18}})
小于18的{$lt:18}
	db.test100.find({age:{$lt:18}})
大于18的{$gt:18}
	db.test100.find({age:{$gt:18}})
大于等于18的{$gte:18}
	db.test100.find({age:{$gte:18}})
不等于18的{$ne:18}
	db.test100.find({age:{$ne:18}})
范围运算符
1. in 功能
	db.test100.find({age:{$in:[12,18,43]}})
2.and 功能
	db.test100.find({age:18,name:"xiaoli"})
3.or 功能
	db.test100.find({$or:[{age:18},{name:"xiaoli"}]})
4.not in 功能
	db.test100.find({age:{$nin:[12,18,43]}})
5.使用$regex或者//编写正则表达式
	db.test100.find({age:{$nin:[12,18,43]}})
	db.test100.find({name:{$regex:'o$'}})
6.limit(2)选择前两条数据用
	db.test100.find().limit(2)
7. skip(2)跳过前两条数据结合使用时先skip在limit效率高
	db.test100.find().skip(2)
投影:
显示指定字段{name:1}
	db.test100.find({$where:function(){return this.age<=18}},{name:1})
不显示特定字段 {age:0,_id:0}
	db.test100.find({},{age:0,_id:0})
不显示_id 字段{_id:0,name:1}
	db.test100.find({$where:function(){return this.age<=18}},{_id:0,name:1})
排列
  • 升序{age:1}降序{age:-1}
	db.test100.find().sort({age:1})
统计个数
	db.test100.find(条件).count()
	db.test100.count(条件)
替换数据
	db.test100.update({name:"xiaowang"},{name:"xiaozhao"})
修改数据,其他部分不变
	db.test100.update({name:"xiaohong"},{$set:{name:"xiaoli"}})
更新全部条件相同的数据{multi:true}
	db.test100.update({name:'xiaogang'},{$set:{sex:"男"}},{multi:true})
消除重复,结果是一个数组
	db.test100.distinct('name')
	db.test100.distinct('name',{age:{$gt:18}})

备份数据

语法:mongodump -d 数据库名-o 备份的路径

	mongodump -d test -o ./Desktop

恢复数据

语法:mongorestore -h 服务器地址-d 要恢复的数据库实例--dir 备份数据的路径

	# 本地恢复不写`-h`
	mongorestore -d test1 --dir ./desktop/test    

聚合 aggregate

聚合是基于数据处理的聚合管道,每个文档通过一个由多个阶段(stage)组成的管道,可以对每个阶段的管道进行分组,过滤等功能,然后经过一系列的处理,输出相应的结果。
语法:db.集合名称.aggregate({管道:{表达式}})

常用管道
  • $group:将集合中的文档分组,可用于统计结果
  • $match:过滤数据,只输出符合条件的文档
  • $project:修改输入文档的结构,如重命名,删除字段,创建计算结果
  • $sort:将输入文档排序后输出
  • $limit:限制聚合管道返回的文档数
  • $skip:跳过指定数量的文档,并返回余下的文档
  • $unwind:将数组类型的字段进行拆分
常用表达式
  • $sum: 计算综合,$sum:1 表示以一倍计数
  • $avg: 计算平均值
  • $min: 获取最小值
  • $max: 获取最大值
  • $push: 在结果文档中插入值到一个数组中
  • $first: 根据资源文档的排序获取第一个文档数据
  • $last: 根据资源文档的排序获取最后一个文档数据

插入数据

db.stu.insert({name:“段誉”,age:16,hometown:“大理”,gender:true})
db.stu.insert({name:“郭靖”,age:20,hometown:“蒙古”,gender:true})
db.stu.insert({name:“黄蓉”,age:18,hometown:“桃花岛”,gender:false})
db.stu.insert({name:“黄药师”,age:40,hometown:“桃花岛”,gender:true})
db.stu.insert({name:“华筝”,age:18,hometown:“蒙古”,gender:false})
db.stu.insert({name:“段王爷”,age:46,hometown:“大理”,gender:true})
db.stu.insert({name:“令狐冲”,age:18,hometown:“华山”,gender:true})

$group分组

  1. 对应的字典中有几个键,结果中就有几个键
  2. 分组依据需要放到_id后面
  3. 取不同字段的值需要使用$符号,$gender,$age
  4. 用全部的字段分组可以达到去重的效果
  • 获取不同组数据的个数和平均值
	db.stu.aggregate({$group:{_id:"$gender",count:{$sum:1},avg_age:{$avg:"$age"}}})
  • 按hometown分组,获取不同组的平均年龄
	db.stu.aggregate({$group:{_id:"$hometown",avg_age:{$avg:"$age"}}})
  • 使用$group统计整个文档
	db.stu.aggregate({$group:{_id:null,count:{$sum:1},avg_age:{$avg:"$age"}}})
$project 修改结构
  • 不显示_id ,现实gender,count,avg_age
    db.stu.aggregate(
        {$group:{_id:"$gender",count:{$sum:1},avg_age:{$avg:"$age"}}},
        {$project:{gender:"$_id",count:1,avg_age:1,_id:0}}
        )
$match过滤数据
  • 查询年龄大于18的学生,按gender分组统计人数
    db.stu.aggregate(
        {$match:{age:{$gte:18}}},
        {$group:{_id:"$gender",count:{$sum:1}}},
        {$project:{gender:"$_id",count:1,_id:0}}
    )
  • 来自蒙古和大理的年龄大于等于18的分组人数
    db.stu.aggregate(
        {$match:{age:{$gte:18},hometown:{$in:["蒙古","大理"]}}},
        {$group:{_id:"$gender",count:{$sum:1}}},
        {$project:{gender:"$_id",count:1,_id:0}}
    )
$sort排序
  • 查询gender人数,按人数排序,升序1,降序-1
    db.stu.aggregate(
        {$group:{_id:"$gender",counter:{$sum:1}}},
        {$sort:{counter:-1}}
        )
$limit限制
  • 限制聚合管道返回的文档数
	db.stu.aggregate({$limit:2})
$skip 跳过
  • 跳过指定数量的文档,并返回余下的文档
	db.stu.aggregate({$skip:2})
$unwind展开
  • 将文档中的某一个数组字段分成多条,每条包含数组中的一个值
  • 语法:db.集合名称.aggregate({$unwind:'$字段名称'})
    • 统计size的个数
    db.t2.insert({_id:1,item:"T-shirt",size:["S","M","L"]}) #插入数据
    db.t2.aggregate(
        {$match:{item:"T-shirt"}},
        {$unwind:"$size"},
        {$group:{_id:null,counter:{$sum:1}}},
        {$project:{_id:0,counter:1}}
    )
  • 属性preserverNullAndEmptyArrays值为true表示保留属性值为空的文档
    db.inventory.aggregate({
        $unwind:{
            path:'$字段名称',
            preserverNullAndEmptyArrays:<boolean>
        }
    })

创建索引

  1. 插入10万条数据
	for(i=1;i<100000;i++){db.t255.insert({name:'test'+i,age:i})}
  1. 查看查询数据的时间,“executionTimeMillis”:147
	db.t255.find({name:"test100000"}).explain("executionStats")
  1. 建立索引,之后查询 “executionTimeMillis” : 28,
  • 语法:db.集合名称.ensureIndex({属性:1})1表示升序,-1,表示降序
	db.t255.ensureIndex({name:1}) # 以name字段建升序索引
查看当前集合的所有索引
  	db.t255.getIndexes()
删除索引
	db.t255.dropIndex({'name':1}) # name是索引名,
创建唯一索引(索引的值是唯一的)
	db.t255.ensureIndex({"name":1},{"unique":true})
建立联合索引
	db.t255.ensureIndex({"name":1,"age":1}) #通过多个字段来确定数据的唯一性,去重

pymongo模块
from pprint import pprint
from pymongo import MongoClient
#实例化一个client,建立连接
client = MongoClient(host='127.0.0.1', port=27017)
collections = client["test"]["t3"]

#插入一条数据
collections.insert_one({'name': 'xiaowang', 'age': 10})

#插入多条数据
data_list = [{'name': 'test{}'.format(i), 'age': i} for i in range(10)]
ret = collections.insert_many(data_list)
print(ret)

#查询一条数据
print(collections.find_one({'name':'xiaowang'}))
#查询所有数据
print(list(collections.find({'name':'xiaowang'})))

#更新一条数据
print(collections.update_one({'age':10},{'$set':{'age':23}}))
#更新全部数据
print(collections.update_many({'name':'xiaowang'},{'$set':{'name':'xiaoli'}}))

#删除
print(collections.delete_one({'age':23}))
#删除所有满足条件的
print(collections.delete_many({'name':'xiaoli'}))

#练习t4
data_list=[{'_id':i,'name':'py{}'.format(i)} for i in range(1000)]
collections.insert_many(data_list)

data_list = list(collections.find())
print(data_list)
pprint([i for i in data_list if i['_id'] % 100 == 0 and i['_id'] != 0])

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值