Mongodb的基本操作

一.环境

此文章的操作运行在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)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值