启动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分组
- 对应的字典中有几个键,结果中就有几个键
- 分组依据需要放到
_id
后面- 取不同字段的值需要使用
$
符号,$gender
,$age
- 用全部的字段分组可以达到去重的效果
- 获取不同组数据的个数和平均值
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>
}
})
创建索引
- 插入10万条数据
for(i=1;i<100000;i++){db.t255.insert({name:'test'+i,age:i})}
- 查看查询数据的时间,“executionTimeMillis”:147
db.t255.find({name:"test100000"}).explain("executionStats")
- 建立索引,之后查询 “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])