一.环境
此文章的操作运行在windows10上
Mongodb版本为:MongoDB shell version v3.6.20
二.Mongodb基本操作
1. 数据库创建
2. 集合操作
3. 集合和数据库的删除
>use dbname
> db.dropDatabase() #删除一个数据库
{ "dropped" : "newdb", "ok" : 1 }
> show dbs
admin 0.000GB
config 0.000GB
local 0.000GB
>use collectionname
> show collections
data
stu
> db.data.drop() #删除一个collection(集合)
true
> show collections
stu
4.Mongodb的数据类型
三.用户操作
四.数据操作
1. 插入数据:
db.stu.insert({_id:11,name:"赵一",age:3,gender:"ture",like:"猫"})
db.stu.insert({_id:12,name:"钱二",age:28,gender:"true",like:"鼠"})
db.stu.insert({_id:13,name:"孙三",age:24,gender:"ture",like:"蛇"})
> db.stu.insert({_id:99,name:"sue",age:26,status:"pending"}) #可以插入数据格式不同
WriteResult({ "nInserted" : 1 })
{ "_id" : 10, "name" : "n1", "age" : 21, "gender" : "false", "like" : "龙" }
{ "_id" : 20, "name" : "sue", "age" : 26, "gender" : "flase", "like" : "猪" }
{ "_id" : 99, "name" : "sue", "age" : 26, "status" : "pending" }
> db.stu.insertMany([{_id:98,name:"secret"},{_id:97,name:"anwser"}])
#可以依次插入多行数据
{ "acknowledged" : true, "insertedIds" : [ 98, 97 ] }
{ "_id" : 99, "name" : "sue", "age" : 26, "status" : "pending" }
{ "_id" : 98, "name" : "secret" }
{ "_id" : 97, "name" : "anwser" }
> db.stu.insertOne({_id:95,name:"hello"}) #插入一行
{ "_id" : 95, "name" : "hello" }
2. 删除:
WriteResult({ "nInserted" : 1 })
> db.stu.find()
{ "_id" : ObjectId("5f87e08975203fcaf136c8d0"), "A" : "1" }
{ "_id" : ObjectId("5f87e1db75203fcaf136c8d1"), "B" : "2" }
{ "_id" : 1, "name" : "王五", "age" : 55, "gender" : true }
{ "_id" : 2, "name" : "gio!", "age" : 52, "gender" : true }
{ "_id" : 3, "name" : "张三", "age" : 52, "gender" : "flase" }
{ "_id" : 4, "name" : "李四", "age" : 15, "gender" : "flase" }
> db.stu.remove({gender:"flase"})
WriteResult({ "nRemoved" : 2 })
> db.stu.find()
{ "_id" : ObjectId("5f87e08975203fcaf136c8d0"), "A" : "1" }
{ "_id" : ObjectId("5f87e1db75203fcaf136c8d1"), "B" : "2" }
{ "_id" : 1, "name" : "王五", "age" : 55, "gender" : true }
{ "_id" : 2, "name" : "gio!", "age" : 52, "gender" : true }
> db.stu.deleteOne({"gender":"true"})
{ "acknowledged" : true, "deletedCount" : 0 }
> db.stu.remove({"gender":true},{justOne:true}) #只删除一个
WriteResult({ "nRemoved" : 1 })
> db.stu.find()
{ "_id" : ObjectId("5f87e08975203fcaf136c8d0"), "A" : "1" }
{ "_id" : ObjectId("5f87e1db75203fcaf136c8d1"), "B" : "2" }
{ "_id" : 2, "name" : "gio!", "age" : 52, "gender" : true }
3. 修改:
{ "_id" : 1, "name" : "N1", "age" : 8, "gender" : "ture" }
{ "_id" : 3, "name" : "N3", "age" : 28, "gender" : "ture" }
{ "_id" : 4, "name" : "N4", "age" : 38, "gender" : "false" }
{ "_id" : 5, "name" : "N5", "age" : 48, "gender" : "ture" }
{ "_id" : 6, "name" : "N6", "age" : 58, "gender" : "ture" }
> db.stu.update({_id:1},{$set:{name:"小王八"}})) #修改数据,但只能修改一个
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.stu.find()
{ "_id" : 1, "name" : "小王八", "age" : 8, "gender" : "ture" }
{ "_id" : 3, "name" : "N3", "age" : 28, "gender" : "ture" }
{ "_id" : 4, "name" : "N4", "age" : 38, "gender" : "false" }
{ "_id" : 5, "name" : "N5", "age" : 48, "gender" : "ture" }
{ "_id" : 6, "name" : "N6", "age" : 58, "gender" : "ture" }
> db.stu.update({gender:"ture"},{$set:{age:10}},{multi:true}) #修改多条语句
WriteResult({ "nMatched" : 4, "nUpserted" : 0, "nModified" : 4 })
> db.stu.find()
{ "_id" : 1, "name" : "小王八", "age" : 10, "gender" : "ture" }
{ "_id" : 3, "name" : "N3", "age" : 10, "gender" : "ture" }
{ "_id" : 4, "name" : "N4", "age" : 38, "gender" : "false" }
{ "_id" : 5, "name" : "N5", "age" : 10, "gender" : "ture" }
{ "_id" : 6, "name" : "N6", "age" : 10, "gender" : "ture" }
> db.stu.update({_id:1},{$unset:{gender:""}}) #删掉某条语句的某个属性
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.stu.find()
{ "_id" : 1, "name" : "小王八", "age" : 10 }
{ "_id" : 3, "name" : "N3", "age" : 10, "gender" : "ture" }
{ "_id" : 4, "name" : "N4", "age" : 38, "gender" : "false" }
{ "_id" : 5, "name" : "N5", "age" : 10, "gender" : "ture" }
{ "_id" : 6, "name" : "N6", "age" : 10, "gender" : "ture" }
4. 查看:
> db.stu.find() #看所有
{ "_id" : 1, "name" : "小王八", "age" : 10 }
{ "_id" : 3, "name" : "N3", "age" : 10, "gender" : "ture" }
{ "_id" : 4, "name" : "N4", "age" : 38, "gender" : "false" }
{ "_id" : 5, "name" : "N5", "age" : 10, "gender" : "ture" }
{ "_id" : 6, "name" : "N6", "age" : 10, "gender" : "ture" }
> db.stu.find({gender:"false"}) #看目标的所有
{ "_id" : 4, "name" : "N4", "age" : 38, "gender" : "false" }
> db.stu.find({gender:"ture"})
{ "_id" : 3, "name" : "N3", "age" : 10, "gender" : "ture" }
{ "_id" : 5, "name" : "N5", "age" : 10, "gender" : "ture" }
{ "_id" : 6, "name" : "N6", "age" : 10, "gender" : "ture" }
> db.stu.findOne({gender:"ture"}) #看目标的一个
{ "_id" : 3, "name" : "N3", "age" : 10, "gender" : "ture" }
4.比较运算
> db.stu.find({age:{$gt:38}}) #age大于38
{ "_id" : 5, "name" : "N5", "age" : 48, "gender" : "ture" }
{ "_id" : 6, "name" : "N6", "age" : 58, "gender" : "ture" }
> db.stu.find({age:{$gte:38}}) #age大于等于38
{ "_id" : 4, "name" : "N4", "age" : 38, "gender" : "false" }
{ "_id" : 5, "name" : "N5", "age" : 48, "gender" : "ture" }
{ "_id" : 6, "name" : "N6", "age" : 58, "gender" : "ture" }
> db.stu.find({age:{$lt:38}}) #age小于38
{ "_id" : 1, "name" : "N1", "age" : 8, "gender" : "ture" }
{ "_id" : 3, "name" : "N3", "age" : 28, "gender" : "ture" }
> db.stu.find({age:{$ne:38}) #age不等于38
{ "_id" : 1, "name" : "N1", "age" : 8, "gender" : "ture" }
{ "_id" : 3, "name" : "N3", "age" : 28, "gender" : "ture" }
{ "_id" : 5, "name" : "N5", "age" : 48, "gender" : "ture" }
{ "_id" : 6, "name" : "N6", "age" : 58, "gender" : "ture" }
5.逻辑运算符
> db.stu.find()
{ "_id" : 1, "name" : "N1", "age" : 8, "gender" : "ture", "like" : "猫" }
{ "_id" : 2, "name" : "N2", "age" : 18, "gender" : "true", "like" : "狗" }
{ "_id" : 3, "name" : "N3", "age" : 28, "gender" : "ture", "like" : "猫" }
{ "_id" : 4, "name" : "N4", "age" : 38, "gender" : "false", "like" : "狗" }
{ "_id" : 5, "name" : "N5", "age" : 48, "gender" : "ture", "like" : "猫" }
{ "_id" : 6, "name" : "N6", "age" : 58, "gender" : "ture", "like" : "狗" }
> db.stu.find({age:{$gt:28},gender:"ture"}) #默认是多个条件在{}是且的关系,查找年龄大于28的男性
{ "_id" : 5, "name" : "N5", "age" : 48, "gender" : "ture", "like" : "猫" }
{ "_id" : 6, "name" : "N6", "age" : 58, "gender" : "ture", "like" : "狗" }
> db.stu.find({$and:[{age:{$gt:28}},{gender:"ture"}]}) #逻辑运算符对应的是一个列表,列表内的条件按照字典存储
{ "_id" : 5, "name" : "N5", "age" : 48, "gender" : "ture", "like" : "猫" }
{ "_id" : 6, "name" : "N6", "age" : 58, "gender" : "ture", "like" : "狗" }
> db.stu.find({$or:[{gender:"false"},{age:{$lt:30}}]}) #逻辑运算外面总总有一对“{}”
{ "_id" : 1, "name" : "N1", "age" : 8, "gender" : "ture", "like" : "猫" }
{ "_id" : 2, "name" : "N2", "age" : 18, "gender" : "true", "like" : "狗" }
{ "_id" : 3, "name" : "N3", "age" : 28, "gender" : "ture", "like" : "猫" }
{ "_id" : 4, "name" : "N4", "age" : 38, "gender" : "false", "like" : "狗" }
> db.stu.find({$and:[{$or:[{gender:"false"},{like:"猫"}]},{age:{$gt:28}}]}) #年龄大于28,并且是女生或者喜欢猫
{ "_id" : 4, "name" : "N4", "age" : 38, "gender" : "false", "like" : "狗" }
{ "_id" : 5, "name" : "N5", "age" : 48, "gender" : "ture", "like" : "猫" }
6.范围运算符
范围运算不是求X-Y之间的数,而是取得X,Y,Z三个数
> db.stu.find({age:{$in:[8,18,28]}}) #找8,18,28三个年龄对应的数据
{ "_id" : 1, "name" : "N1", "age" : 8, "gender" : "ture", "like" : "猫" }
{ "_id" : 2, "name" : "N2", "age" : 18, "gender" : "true", "like" : "狗" }
{ "_id" : 3, "name" : "N3", "age" : 28, "gender" : "ture", "like" : "猫" }
> db.stu.find({age:{$nin:[8,18,28]}}) #找除开8,18,28三个年龄对应的数据
{ "_id" : 4, "name" : "N4", "age" : 38, "gender" : "false", "like" : "狗" }
{ "_id" : 5, "name" : "N5", "age" : 48, "gender" : "ture", "like" : "猫" }
{ "_id" : 6, "name" : "N6", "age" : 58, "gender" : "ture", "like" : "狗" }
7.正则表达式
> db.stu.find({name:{$regex:"^李"}}) #名字以“李”开头的
> db.stu.find({name:/李/}) #相同效果
{ "_id" : 14, "name" : "李四", "age" : 18, "gender" : "false", "like" : "狗" }
{ "_id" : 15, "name" : "李四爷", "age" : 15, "gender" : "ture", "like" : "猫" }
> db.stu.find({name:/生/}))
{ "_id" : 16, "name" : "小花生", "age" : 59, "gender" : "ture", "like" : "牛" }
能不能美化windows cmd
> db.stu.find({name:/n/i}) #找到名字中含有n的,忽略大小写
> db.stu.find({name:{$regex:"n",$options:"i"}})
{ "_id" : 1, "name" : "N1", "age" : 8, "gender" : "ture", "like" : "猫" }
{ "_id" : 2, "name" : "N2", "age" : 18, "gender" : "true", "like" : "狗" }
{ "_id" : 3, "name" : "N3", "age" : 28, "gender" : "ture", "like" : "猫" }
{ "_id" : 4, "name" : "N4", "age" : 38, "gender" : "false", "like" : "狗" }
{ "_id" : 5, "name" : "N5", "age" : 48, "gender" : "ture", "like" : "猫" }
{ "_id" : 6, "name" : "N6", "age" : 58, "gender" : "ture", "like" : "狗" }
{ "_id" : 10, "name" : "n1", "age" : 21, "gender" : "false", "like" : "龙" }
8.函数
> db.stu.find({ #可以写函数选择求值范围,可以不用正则表达式和其中自带的各种运算符
... $where:function(){
... return this.age>20
... }
... })
{ "_id" : 3, "name" : "N3", "age" : 28, "gender" : "ture", "like" : "猫" }
{ "_id" : 4, "name" : "N4", "age" : 38, "gender" : "false", "like" : "狗" }
{ "_id" : 5, "name" : "N5", "age" : 48, "gender" : "ture", "like" : "猫" }
{ "_id" : 6, "name" : "N6", "age" : 58, "gender" : "ture", "like" : "狗" }
{ "_id" : 12, "name" : "钱二", "age" : 28, "gender" : "true", "like" : "鼠" }
{ "_id" : 13, "name" : "孙三", "age" : 24, "gender" : "ture", "like" : "蛇" }
{ "_id" : 16, "name" : "小花生", "age" : 59, "gender" : "ture", "like" : "牛" }
{ "_id" : 10, "name" : "n1", "age" : 21, "gender" : "false", "like" : "龙" }
9.查询结果限制
> db.stu.find().limit(4)
{ "_id" : 1, "name" : "N1", "age" : 8, "gender" : "ture", "like" : "猫" }
{ "_id" : 2, "name" : "N2", "age" : 18, "gender" : "true", "like" : "狗" }
{ "_id" : 3, "name" : "N3", "age" : 28, "gender" : "ture", "like" : "猫" }
{ "_id" : 4, "name" : "N4", "age" : 38, "gender" : "false", "like" : "狗" }
> db.stu.find().skip(4)
{ "_id" : 5, "name" : "N5", "age" : 48, "gender" : "ture", "like" : "猫" }
{ "_id" : 6, "name" : "N6", "age" : 58, "gender" : "ture", "like" : "狗" }
{ "_id" : 11, "name" : "赵一", "age" : 3, "gender" : "ture", "like" : "猫" }
{ "_id" : 12, "name" : "钱二", "age" : 28, "gender" : "true", "like" : "鼠" }
{ "_id" : 13, "name" : "孙三", "age" : 24, "gender" : "ture", "like" : "蛇" }
{ "_id" : 14, "name" : "李四", "age" : 18, "gender" : "false", "like" : "狗" }
{ "_id" : 15, "name" : "李四爷", "age" : 15, "gender" : "ture", "like" : "猫" }
{ "_id" : 16, "name" : "小花生", "age" : 59, "gender" : "ture", "like" : "牛" }
{ "_id" : 10, "name" : "n1", "age" : 21, "gender" : "false", "like" : "龙" }
{ "_id" : 20, "name" : "sue", "age" : 26, "gender" : "flase", "like" : "猪" }
{ "_id" : 99, "name" : "sue", "age" : 26, "status" : "pending" }
{ "_id" : 98, "name" : "secret" }
{ "_id" : 97, "name" : "anwser" }
{ "_id" : 95, "name" : "hello" }
> db.stu.find().skip(4).limit(3) #优先执行skip,先跳过前4个,然后显示之后的3个
{ "_id" : 5, "name" : "N5", "age" : 48, "gender" : "ture", "like" : "猫" }
{ "_id" : 6, "name" : "N6", "age" : 58, "gender" : "ture", "like" : "狗" }
{ "_id" : 11, "name" : "赵一", "age" : 3, "gender" : "ture", "like" : "猫" }
10.投影
> db.stu.find({},{name:1,age:1}) #先一个大括号,可以仅看id和名字年龄
{ "_id" : 1, "name" : "N1", "age" : 8 }
{ "_id" : 2, "name" : "N2", "age" : 18 }
{ "_id" : 3, "name" : "N3", "age" : 28 }
{ "_id" : 4, "name" : "N4", "age" : 38 }
{ "_id" : 5, "name" : "N5", "age" : 48 }
{ "_id" : 6, "name" : "N6", "age" : 58 }
{ "_id" : 11, "name" : "赵一", "age" : 3 }
{ "_id" : 12, "name" : "钱二", "age" : 28 }
11.统计
> db.stu.find({gender:"false"}).count() #先查数据再按目标统计
> db.stu.count({gender:"false"}) #先按目标选取再统计
3
12.排序
> db.stu.find().sort({age:1,_id:-1}) #先按年龄升序排列,再按_id降序排列
{ "_id" : 98, "name" : "secret" }
{ "_id" : 97, "name" : "anwser" }
{ "_id" : 95, "name" : "hello" }
{ "_id" : 11, "name" : "赵一", "age" : 3, "gender" : "ture", "like" : "猫" }
{ "_id" : 1, "name" : "N1", "age" : 8, "gender" : "ture", "like" : "猫" }
{ "_id" : 15, "name" : "李四爷", "age" : 15, "gender" : "ture", "like" : "猫" }
{ "_id" : 14, "name" : "李四", "age" : 18, "gender" : "false", "like" : "狗" }
{ "_id" : 2, "name" : "N2", "age" : 18, "gender" : "true", "like" : "狗" }
> db.stu.distinct('name',{}) #按name进行去重
[
"赵一",
"钱二",
"孙三",
"李四",
"李四爷",
"小花生",
"n1",
"sue",
"secret"。。。。,]
13.复合查询(aggregate管道)
Aggregate():
> db.stu.aggregate({$group:{_id:"$gender"}}) #按性别分组
{ "_id" : null }
{ "_id" : "false" }
{ "_id" : "true" }
{ "_id" : "ture" }
{ "_id" : "flase" }
$group:
> db.stu.aggregate([{$group:{_id:"$gender",sum_age:{$sum:"$age"}}}])
#按性别分组,求各组的年龄和
{ "_id" : null, "sum_age" : 26 }
{ "_id" : "false", "sum_age" : 93 }
{ "_id" : "true", "sum_age" : 28 }
{ "_id" : "ture", "sum_age" : 101 }
{ "_id" : "flase", "sum_age" : 26 }
> db.stu.aggregate([{$group:{_id:"$gender",sum_age:{$avg:"$age"}}}])
$sum,$avg还可以是$min, $max, $first. $last
{ "_id" : null, "sum_age" : 26 }
{ "_id" : "false", "sum_age" : 31 }
{ "_id" : "true", "sum_age" : 28 }
{ "_id" : "ture", "sum_age" : 25.25 }
{ "_id" : "flase", "sum_age" : 26 }
> db.stu.aggregate([{$group:{_id:"$like",max_age:{$max:"$age"}}}]) #先喜好分组求每组最大年龄
{ "_id" : "猪", "max_age" : 26 }
{ "_id" : "牛", "max_age" : 59 }
{ "_id" : "龙", "max_age" : 21 }
{ "_id" : "鼠", "max_age" : 28 }
{ "_id" : "狗", "max_age" : 18 }
{ "_id" : null, "max_age" : 54 }
{ "_id" : "蛇", "max_age" : 24 }
{ "_id" : "猫", "max_age" : 15 }
$push
> db.stu.aggregate([{$group:{_id:"$gender",anmimals:{$push:"$like"}}}])
#按性别分,喜欢的宠物的类型
#push是用于聚集非数字类型的数据,将字符类型数据放在一起
{ "_id" : null, "anmimals" : [ ] }
{ "_id" : "false", "anmimals" : [ "狗", "龙" ] }
{ "_id" : "true", "anmimals" : [ "鼠" ] }
{ "_id" : "ture", "anmimals" : [ "猫", "蛇", "猫", "牛" ] }
{ "_id" : "flase", "anmimals" : [ "猪" ] }
$match:
> db.stu.aggregate([{$match:{like:"猫"}}]) #只有aggregate能够传递管道
{ "_id" : 11, "name" : "赵一", "age" : 3, "gender" : "ture", "like" : "猫" }
{ "_id" : 15, "name" : "李四爷", "age" : 15, "gender" : "ture", "like" : "猫" }
> db.stu.find({like:"猫"}) #功能一致
{ "_id" : 11, "name" : "赵一", "age" : 3, "gender" : "ture", "like" : "猫" }
{ "_id" : 15, "name" : "李四爷", "age" : 15, "gender" : "ture", "like" : "猫" }
#找出年龄大于20岁,按性别分类的平均年龄
> db.stu.aggregate([
... {$match:{age:{$gt:20}}}, #match和find作用相当,但find不可以用在aggregate中
... {$group:{_id:"$gender",avg_age:{$avg:"$age"}}}
... ])
{ "_id" : null, "avg_age" : 26 }
{ "_id" : "false", "avg_age" : 37.5 }
{ "_id" : "ture", "avg_age" : 41.5 }
{ "_id" : "flase", "avg_age" : 26 }
{ "_id" : "true", "avg_age" : 28 }
#年龄小于50的人中,按爱好分组,求年龄之和和平均值,并且只想看和
$project:
db.stu.aggregate([
{$match:{age:{$lt:50}}},
{$group:{_id:"$like",sum_age:{$sum:"$age"},avg_age:{$avg:"$age"}}},
{$project:{sum_age:1}}
])
{ "_id" : "猪", "sum_age" : 26 }
{ "_id" : "龙", "sum_age" : 21 }
{ "_id" : "鼠", "sum_age" : 28 }
{ "_id" : "狗", "sum_age" : 18 }
{ "_id" : null, "sum_age" : 26 }
{ "_id" : "蛇", "sum_age" : 24 }
{ "_id" : "猫", "sum_age" : 18 }
$sort
#找到性别为false的人,按年龄逆序排列,而且仅看age和gender字段
> db.stu.aggregate([
... {$match:{gender:"false"}},
... {$sort:{age:-1}},
... {$project:{gender:1,age:1}}
... ])
{ "_id" : 1, "age" : 54, "gender" : "false" }
{ "_id" : 10, "age" : 21, "gender" : "false" }
{ "_id" : 14, "age" : 18, "gender" : "false" }
$skip $limit
#跳过5个后选2个
> db.stu.aggregate([
... {$skip:5},
... {$limit:2},
... ])
{ "_id" : 16, "name" : "小花生", "age" : 59, "gender" : "ture", "like" : "牛" }
{ "_id" : 10, "name" : "n1", "age" : 21, "gender" : "false", "like" : "龙" }
#选5个跳过前2个
> db.stu.aggregate([
... {$limit:5},
... {$skip:2}
... ])
{ "_id" : 13, "name" : "孙三", "age" : 24, "gender" : "ture", "like" : "蛇" }
{ "_id" : 14, "name" : "李四", "age" : 18, "gender" : "false", "like" : "狗" }
{ "_id" : 15, "name" : "李四爷", "age" : 15, "gender" : "ture", "like" : "猫" }
$unwind
可以拆分列表,而$push会产生列表
#男女分组后,每组的名字是什么,不去重
> db.stu.aggregate([
... {$group:{_id:"$gender",names:{$push:"$name"}}}
... ])
{ "_id" : null, "names" : [ "sue", "secret", "anwser", "hello" ] }
{ "_id" : "false", "names" : [ "李四", "n1", "赵一" ] }
{ "_id" : "true", "names" : [ "钱二" ] }
{ "_id" : "ture", "names" : [ "赵一", "孙三", "李四爷", "小花生" ] }
{ "_id" : "flase", "names" : [ "sue" ] }
#男女分组后,每组的名字是什么,不去重,将push的结果列表拆分开
> db.stu.aggregate([
... {$group:{_id:"$gender",names:{$push:"$name"}}},
... {$unwind:"$names"}
... ])
{ "_id" : null, "names" : "sue" }
{ "_id" : null, "names" : "secret" }
{ "_id" : null, "names" : "anwser" }
{ "_id" : null, "names" : "hello" }
{ "_id" : "false", "names" : "李四" }
{ "_id" : "false", "names" : "n1" }
{ "_id" : "false", "names" : "赵一" }
{ "_id" : "true", "names" : "钱二" }
{ "_id" : "ture", "names" : "赵一" }
{ "_id" : "ture", "names" : "孙三" }
{ "_id" : "ture", "names" : "李四爷" }
{ "_id" : "ture", "names" : "小花生" }
{ "_id" : "flase", "names" : "sue" }
#年龄小于30岁,按找性别分组,取出喜欢的宠物,并且拆分结果列表
db.stu.aggregate([
... {$match:{age:{$lt:30}}},
... {$group:{_id:"$gender",likes:{$push:"$like"}}},
... {$unwind:"$likes"}
... ])
{ "_id" : "false", "likes" : "狗" }
{ "_id" : "false", "likes" : "龙" }
{ "_id" : "true", "likes" : "鼠" }
{ "_id" : "ture", "likes" : "猫" }
{ "_id" : "ture", "likes" : "蛇" }
{ "_id" : "ture", "likes" : "猫" }
{ "_id" : "flase", "likes" : "猪" }
为什么使用group的时候分组需要加”_id”
因为,分组后相当于产生了新的表(或者新的集合collections),需要用_id来标识每一个分组结果形成的表
14.索引
#插入50W条数据到新表data中
for (var i =0;i <= 500000; i++){
db.data.insert(
{
_id:"no"+i,
name:"name"+i,
age:i
})
}
db.data.find({_id:"no52577"}).explain('executionStats')
"executionTimeMillis" : 0 #毫秒为单位,以_id查找数据是最快的,但是无法记忆,因此令名字字段为key
db.data.find({name:"name52577"}).explain('executionStats')
"executionTimeMillis" : 151
db.data.find({age:52577}).explain('executionStats')
"executionTimeMillis" : 154
#将name字段设置为索引,会使其搜索得很快
> db.data.ensureIndex({name:1})
{
"createdCollectionAutomatically" : false,
"numIndexesBefore" : 1,
"numIndexesAfter" : 2,
"ok" : 1
}
db.data.find({name:"name52577"}).explain('executionStats')
"executionTimeMillisEstimate" : 0,
#查看已经有的所有索引
> db.data.getIndexes()
[
{
"v" : 2,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "newdb.data"
},
{
"v" : 2,
"key" : {
"name" : 1
},
"name" : "name_1", #增加的索引的名字换改成“name_1”
"ns" : "newdb.data"
}
]
#删除创建过的索引
> db.data.dropIndex("name_1")
{ "nIndexesWas" : 2, "ok" : 1 }
> db.data.getIndexes()
[
{
"v" : 2,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "newdb.data"
}
索引在查询数据方面十分迅速,但是索引又必须唯一,因此在需要查询的时候,将某个易于记忆的字段设置为索引,之后再将其删除即可
15.备份
“'mongodump' is a command/tool which is included in the 'mongodb-tools' package. If you don't have this package installed on your machine, it makes sense that it is not defined. The mongodb-tools also provide several other tools used for importing and exporting DBs (like mongorestore).
That being said, 'mongodump' is not a mongo-shell command, you shouldn't be using it in mongo-shell. It's a whole different command that you would be executing just like you execute 'mongod' or 'mongo' etc.“
不是在mongodb的shell中输入指令,而是在windows cmd中输入
d:\Mongodb>D:\Mongodb\bin\mongodump.exe -h 127.0.0.1:27017 -d newdb -o d:\Mongodb\backup_mongo
2020-10-16T19:18:52.702+0800 writing newdb.data to
2020-10-16T19:18:52.733+0800 writing newdb.stu to
2020-10-16T19:18:52.742+0800 done dumping newdb.stu (13 documents)
2020-10-16T19:18:53.305+0800 done dumping newdb.data (500001 documents)
16.恢复数据库
C:\Users\lLate>mongorestore -h 127.0.0.1:27017 -d first --dir d:\Mongodb\backup_mongo\newdb
2020-10-16T19:29:31.534+0800 the --db and --collection args should only be used when restoring from a BSON file. Other uses are deprecated and will not exist in the future; use --nsInclude instead
2020-10-16T19:29:31.547+0800 building a list of collections to restore from d:\Mongodb\backup_mongo\newdb dir
2020-10-16T19:29:31.548+0800 reading metadata for first.data from d:\Mongodb\backup_mongo\newdb\data.metadata.json
2020-10-16T19:29:31.548+0800 reading metadata for first.stu from d:\Mongodb\backup_mongo\newdb\stu.metadata.json
2020-10-16T19:29:31.554+0800 restoring first.data from d:\Mongodb\backup_mongo\newdb\data.bson
2020-10-16T19:29:31.560+0800 restoring first.stu from d:\Mongodb\backup_mongo\newdb\stu.bson
2020-10-16T19:29:31.560+0800 no indexes to restore
2020-10-16T19:29:31.560+0800 finished restoring first.stu (13 documents)
2020-10-16T19:29:34.533+0800 [#####################...] first.data 24.0MB/27.0MB (88.9%)
2020-10-16T19:29:34.908+0800 [########################] first.data 27.0MB/27.0MB (100.0%)
2020-10-16T19:29:34.908+0800 no indexes to restore
2020-10-16T19:29:34.909+0800 finished restoring first.data (500001 documents)
2020-10-16T19:29:34.909+0800 done
#从数据库中导出文件
#一个json格式的表,在cmd输入命令
C:\Users\lLate> mongoexport -h 127.0.0.1:27017 -d first -c stu -o d:\Mongodb\file_mongo\stu.json
2020-10-16T19:35:46.462+0800 connected to: 127.0.0.1:27017
2020-10-16T19:35:46.476+0800 exported 13 records
C:\Users\lLate>mongoexport -h 127.0.0.1:27017 -d first -c stu -o d:Mongodb\file_mongo\data.csv --type csv -f _id,name,gender,like
导出csv需要在-f后面加上需要导出的列
2020-10-16T19:42:33.223+0800 connected to: 127.0.0.1:27017
2020-10-16T19:42:33.237+0800 exported 13 records
#导入文件到数据库中(json)
C:\Users\lLate>mongoimport -h 127.0.0.1 -d newdb -c book --file D:\Mongodb\file_mongo\stu.json
2020-10-16T19:56:26.919+0800 connected to: 127.0.0.1
2020-10-16T19:56:26.948+0800 imported 6 documents
四.和python交互
import pymongo
import json
try:
#1.连接mongodb的服务
mongo_py = pymongo.MongoClient()
#2.选择需要交互的数据库和表(collections),有数据会自动建库建表
#建立数据库
# db = mongo_py['firstdb']
#创建表/集合
# collection = db['firstcollection']
# collection = =mongo_py['firstdb']['firstcollection'] 可以将上面两条语句合并为一条
collection = mongo_py.firstdb.firstcollection
#3.插入数据
one = {"name":"张三","age":50 } #单条
# collection.insert_one(one)
two_many = [ #多条
{"name": "张三", "age": 50},
{"name": "李四", "age": 10},
{"name": "王五", "age": 13},
{"name": "lisa", "age": 99}
]
# collection.insert_many(two_many)
#collection.insert() 可以插入一条或者多条
#4.删除数据
# collection.delete_one({"age":50})
# collection.delete_many({"age": 50})
# 5.修改数据
# collection.update_one({"age":13},{"$set":{"name":"小王"}})
# collection.update_many({"name":"小王"},{"$set":{"age":100}})
#collection.update({"name": "小王"}, {"$set": {"age": 11}}) update is deprecated. Use replace_one, update_one or update_many instead.
# 5.查询数据
result = collection.find({"age":100}) #result是一个游标对象,指向查询出来的所有数据
for data in result:
print(data)
result1 = collection.find_one({"name":"lisa"})
print(result1)
#collection.aggregate() 可以使用聚集函数
except Exception as e:
print(e)
#4.关闭数据库
mongo_py.close()
def test1(): #json写入mongodb
connection = pymongo.MongoClient('localhost')
collection = connection.demo01.wz
with open("01_json.json",'r',encoding="utf-8") as f:
list_ = json.load(f)
print(type(list_))
for temp in list_:
print(temp)
collection.insert_one(temp)