mongodb常用操作

mongodb常用操作

1. 演示数据

{"_id":1, "name":"张三", "age":18, "gender":true}
{"_id":2, "name":"李四", "age":15, "gender":false}
{"_id":3, "name":"王五", "age":30, "gender":true}
{"_id":4, "name":"小明", "age":10, "gender":true}
{"_id":5, "name":"小红", "age":8, "gender":false}
{"_id":6, "name":"小平", "age":28, "gender":true}
{"_id":7, "name":"小兰", "age":28, "gender":false}
{"_id":8, "name":"Alex", "age":38, "gender":true}
{"_id":9, "name":"张小", "age":6, "gender":false}
{"_id":10, "name":"aox", "age":28, "gender":true}

2. 基本操作

use admin  # 切换到admin数据库

db.createUser({user:'deng',pwd:'123456',roles:['root']}) # 创建账户,创建root账户后,后续操作需要先登录

db.auth('deng','123456')  # 登录root账户,返回1说明登录成功

show dbs # 查看数据库

show users # 查看用户

use test  # 切换到test库,没有不用创建库

db.testa.insert({'name':'zhangsan'}) # 往testa表中加一条数据,插入数据时,表和库会自动创建

db.testa.find()  # 查看数据

db.testa.drop()  # 删除表 testa

db  # 显示当前数据库

show collections  # 显示表

db.createUser({user:'A',pwd:'123456',roles:[{'db':'test',role:'read'}]}) # 创建一个用户A(要先切到admin库),只对test库有读的权限

db.dropUser('用户名') # 删除用户

# 删除数据库test
use test
db.dropDatabase()

3. 增、删、改、查

3.1 插入数据

语法:db.表名.insert({dict})

向students数据库中,stu表中插入演示数据:

use students
db.stu.insert({"_id":1, "name":"张三", "age":18, "gender":true})
db.stu.insert({"_id":2, "name":"李四", "age":15, "gender":false})
db.stu.insert({"_id":3, "name":"王五", "age":30, "gender":true})
db.stu.insert({"_id":4, "name":"小明", "age":10, "gender":true})
db.stu.insert({"_id":5, "name":"小红", "age":8, "gender":false})
db.stu.insert({"_id":6, "name":"小平", "age":20, "gender":true})
db.stu.insert({"_id":7, "name":"小兰", "age":28, "gender":false})
db.stu.insert({"_id":8, "name":"Alex", "age":38, "gender":true})
db.stu.insert({"_id":9, "name":"张小", "age":6, "gender":false})
db.stu.insert({"_id":10, "name":"aux", "age":28, "gender":true})

在这里插入图片描述

3.2 删除数据

语法:db.表名.remove({条件})
db.stu.remove({name:"张三"}) # 删除name为张三的数据

db.stu.remove({gender:true},{justOne:true}) # 删除gender为true的,只删除一个

db.stu.remove({}) # 删除所有

3.3 更新数据

语法:db.表名.update({条件}, {$set:{字段:值}})
db.stu.update({name:"小兰"}, {$set:{age:20}}) # 将小兰的年龄改为20

db.stu.update({gender:false},{$set:{age:66}},{multi:true})  # 将gender为false的人的年龄全改为66,如果不加multi参数,则只会修改一个

db.stu.update({name:"小兰"},{$unset:{gender:""}}) # 将小兰的gender字段删掉

3.4 基本查询

语法:db.表名.find({条件})
db.stu.find({gender:false}) # 查询gender为false

db.stu.findOne({gender:false}) # 查询gender为false的,只查一个
比较运算符
$lt:小于
$lte:小于等于
$gt:大于
$gte:大于等于
$ne:不等于
db.stu.find({age:{$gt:10}}) # 年龄大于10

db.stu.find({age:{$gt:10,$lt:20}}) # 年龄大于10 小于20

在这里插入图片描述

逻辑运算符: $and $or
db.stu.find({age:{$gt:10},gender:true}) # 年龄大于10且gender为ture
db.stu.find({$and:[{age:{$gt:10}},{gender:true}]})  # 同上

db.stu.find({$or:[{age:{$gt:10}},{gender:false}]}) # 年龄大于10 或者gender为false

在这里插入图片描述

范围运算符 $in $nin
db.stu.find({age:{$in:[8,6,15]}})
db.stu.find({age:{$nin:[8,6,15]}})

在这里插入图片描述

正则: $regex 或 /xxx/
db.stu.find({name:{$regex:'^小'}}) #名字以小开头的
db.stu.find({name:/^/}) # 同上

db.stu.find({name://})  # 名字中包含小

db.stu.find({name:/a/}) # 名字中包含a的

db.stu.find({name:/a/i}) # 忽略大小写
db.stu.find({name:{$regex:'a',$options:'i'}}) #同上

在这里插入图片描述

在这里插入图片描述

查询结果显示
db.stu.find()  #查看集合中所有的内容

db.stu.find().limit(4) #显示前4

db.stu.find().skip(2) # 跳过前两个

db.stu.find().skip(2).limit(3)
db.stu.find().limit(3).skip(2) # 结果同上,优先执行skip

在这里插入图片描述

db.stu.find({},{name:1,age:1}) # 显示name和age字段,不显示写0
db.stu.find({},{name:0,age:0}) # 不显示name和age字段

在这里插入图片描述

db.stu.find({gender:true}).count() 统计gender为ture的个数
db.stu.count({gender:true}) # 同上

db.stu.count() # 统计总数
db.stu.find().count()

db.stu.find().sort({age:1}) # 按年龄升序排序
db.stu.find().sort({age:-1}) # 按年龄降序排序
db.stu.find().sort({age:1, _id:-1}) # 按年龄升序、id降序排序
db.stu.distinct('age',{}) # 显示age字段的去重后的值

在这里插入图片描述

3.5 复合查询

$group:分组
db.stu.aggregate([{$group:{_id:"$gender"}}]) # 按照gender分组

在这里插入图片描述

# 表达式 $sum  $avg $first $last $max $min

# 按照性别分组,求年龄之和
db.stu.aggregate([ {$group:{_id:"$gender", sumage:{$sum:"$age"}}} ])

# 按照性别分组,求平均年龄
db.stu.aggregate([ {$group:{_id:"$gender", avgage:{$avg:"$age"}}} ])

在这里插入图片描述

$match == find 区别在于find不能用管道传递
db.stu.aggregate([{$match:{gender:true}}]) # gender为ture的人

# 求年龄大于10,男女年龄的平均值
db.stu.aggregate([{$match:{age:{$gt:10}}},
				  {$group:{_id:"$gender",avgage:{$avg:"$age"}}}
				])

在这里插入图片描述

$project 投影,显示字段,显示1或者true
# 年龄大于10,按照gender分组,求年龄之和以及年龄平均值,只看之和
db.stu.aggregate([{$match:{age:{$gt:10}}},
				  {$group:{_id:"$gender",sumage:{$sum:"$age"},avgage:{$avg:"$age"}}},
				  {$project:{sumage:1}}
				])

在这里插入图片描述

$sort排序
db.stu.aggregate([{$match:{age:{$gt:10}}},
				  {$group:{_id:"$gender",sumage:{$sum:"$age"},avgage:{$avg:"$age"}}},
				  {$project:{sumage:1}},
				  {$sort:{sumage:-1}}
				])

在这里插入图片描述

$skip $limit
db.stu.find().limit(5).skip(2)  # find中limt和skip优先执行skip

db.stu.aggregate([{$limit:5}, {$skip:2}])  # limit和skip顺序影响结果

在这里插入图片描述

$unwind 拆分列表 $push
# 男女分组之后各自的名字有哪些
db.stu.aggregate([{$group:{_id:"$gender", allname:{$push:"$name"}}}])

db.stu.aggregate([{$group:{_id:"$gender", allname:{$push:"$name"}}},
	              {$unwind:"$allname"}
])

在这里插入图片描述

4. 其他操作

4.1 设置索引

向data集合中添加50万条测试数据,执行以下命令:

for (var i=0; i<=500000; i++) {db.data.insert({_id:i,user:"user"+i,age:i})}

在这里插入图片描述
分别查询 {_id:333333, user:“user333333”, age:333333}这条记录,查看耗时时间:

# 比较查询的速度,单位是毫秒
# _id
db.data.find({_id:333333}).explain('executionStats')

# user
db.data.find({user:"user333333"}).explain('executionStats')

# age
db.data.find({age:333333}).explain('executionStats')

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

# 设置内容key为id,提高查询速度

db.data.ensureIndex({user:1})

db.data.find({user:"user333333"}).explain('executionStats')

在这里插入图片描述
在这里插入图片描述

查看索引
# 查看索引

db.data.getIndexes()

在这里插入图片描述

删除索引
db.data.dropIndex('user_1')

在这里插入图片描述

4.2 备份和恢复

非授权验证模式启动mongod

数据库备份
mongodump -h <hostname><:port> -d dbname -o dbdirectory
  • -h:
    MongoDB 所在服务器地址,例如:127.0.0.1,当然也可以指定端口号:127.0.0.1:27017

  • -d:
    需要备份的数据库实例,例如:test

  • -o:
    备份的数据存放位置,例如:/data/mdbdump,当然该目录需要提前建立,在备份完成后,系统自动在 /data/mdbdump 目录下建立一个 test 目录,这个目录里面存放该数据库实例的备份数据。

# 备份test库
# 将test库备份到/data/mdbdump路径中
mongodump -h 127.0.0.1:27017 -d test -o /data/mdbdump
数据库恢复
mongorestore -h <hostname><:port> -d dbname <path>
  • – hostname:port:
    MongoDB所在服务器地址,默认为: localhost:27017

  • – db , -d :
    需要恢复的数据库实例,例如:test,当然这个名称也可以和备份时候的不一样,比如test2

  • – drop:
    恢复的时候,先删除当前数据,然后恢复备份的数据。就是说,恢复后,备份后添加修改的数据都会被删除,慎用哦!

  • – path:
    mongorestore 最后的一个参数,设置备份数据所在位置,例如:/data/mdbdump/test
    你不能同时指定 和 --dir 选项,–dir也可以设置备份目录。

  • – dir:
    指定备份的目录,不能同时指定path 和 --dir 选项。

# 恢复库
# 将备份的test库恢复到newdb库中
mongorestore -h 127.0.0.1:27017 -d newdb --dir /data/mdbdump/test

4.3 文件导出和导入

# 导出文件
# 将mydb库中的mycol集合导出到 /data/data.json文件中
mongoexport -h 127.0.0.1:27017 -d mydb-c mycol -o /data/data.json

# 将mydb库中的mycol集合导出到 /data/data.csv文件中
mongoexport -h 127.0.0.1:27017 -d mydb -c mycol -o /data/data.csv --type csv


# 导入文件
# /data/data.json文件导入到newdb库中的newcol集合中
mongoimport -h 127.0.0.1:27017 -d newdb -c newcol --file /data/data.json
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jepson2017

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值