MongoDB高级操作

MongoDB的查询数据(find)查询结果的处理

(1)limit()与skip()

limit()分片显示指定个数
skip()跳过指定个数开始显示

如果skip()与limit()一起使用,无论顺序是什么都是先执行skip()再执行limit()
db.stu.find().skip(2).limit(1)

(2)投影(当find()添加第二个参数时,默认启用投影)

# 如果指定显示字段(name),默认其他字段不显示,但_id会显示(写1与true是同一种意思)
db.stu.find({gender: true}, {name: true})
db.stu.find({gender:true}, {name: 1})

# 如果指定不显示的字段(name),默认其他字段都会显示,_id也会显示(0与false一个意思)
db.stu.find({gender: true}, {name: false})
db.stu.find({gender : true}, {name : 0})

# 不想显示_id需要单独指定为不显示
db.stu.find({gender: true}, {name: 1, _id: 0})

(3)sort()排序处理

# 对所有文档按age值升序排序
db.stu.find().sort({age: 1})

# 对所有文档,按age值降序排序
db.stu.find().sort({age: -1})

# 先按age升序排序,如果有重复的age值,则按gender降序排序
db.stu.find().sort({age: 1, gender: -1})

(4)count()统计个数

count()的语法与find()的语法一致
但是find()返回所有符合条件的文档,count()返回所有符合条件的文档个数

# 在find()后调用count()
db.stu.find({age: {$lte: 18}, gender: false}).count()

# 直接使用count()返回个数(对于一些特殊查询不如find()完善)
db.stu.count({age: {$ltr: 18}, gender: false})

(5)去重显示distinct()

distinct()有两个参数,第一个参数表示去重显示的字段值,第二个参数是和find()一样的,查询条件最后返回的结果是 指定显示的字段值 去重后的列表

# 查看age大于18的籍贯,并去重返回列表
db.stu.distinct("hometown", {age: {$gt: 18}})

MongoDB聚合统计运算

(1)$group 分组统计

# 对所有文档按gender进行分组,并统计每组的age总和,保存在sum_age字段
db.stu.aggregate([{$group: {_id: "$gender", sum_age: {$sum: "$age"}}}])

# 对所有文档按gender进行分组,并统计每组的文档个数,保存在count()字段里
db.stu.aggregate([{$group: {_id: "$gender", count: {$sum: 1}}}])

# 按hometown分组,并统计每组age的平均数,保存在avg_age里
db.stu.aggregate([{$group: {_id: "$hometown", avg_age: {$avg: "$age"}}}])

# 按hometown分组,并统计每组的最大值/最小值,保存在max_age/min_age中
db.stu.aggregate([{$group: {_id: "$hometown", max_age: {$max: "$age"}}}])
db.stu.aggregate([{$group: {_id: "$hometown", min_age: {$min: "$age"}}}])

# first(显示出第一个),last(显示出最后一个)
db.stu.aggregate([{$group: {_id: "$hometown", first_name: {$first: "$name"}}}])
db.stu.aggregate([{$group: {_id: "$hometown", lat_name: {$last: "$name"}}}])

# push(显示出组中的所有字段)
db.stu.aggregate([{$group: {_id: "$hometown", all_name: {$push: "$name"}}}])

(2)$match 按条件过滤

可以先通过 $match 过滤符合条件的文档,再进行 $group 分组统计

db.stu.aggregate([
				    # match匹配 所有 hometown 不是 "汉" 的文档数据
				    {$match : {hometown : {$nin : ["汉"]}}},
				    # group 按 hometown 分组,并统计 age 总和 和 age平均数
				    {$group : {_id : "$hometown", sum_age : {$sum : "$age"}, avg_age : {$avg : "$age"}}}
				 ])

(3)$project 投影处理

处理机制和 find()的投影一样

db.stu.aggregate([
				    {$match : {hometown : {$nin : ["汉"]}}},
				    {$group : {_id : "$hometown", sum_age : {$sum : "$age"}, avg_age : {$avg : "$age"}}},
				    # 显示 avg_age,默认其他字段不显示,但_id一定会显示,所以需要单独指定_id 为 0 、 false 表示不显示
				    {$project : {avg_age : 1, _id : false}}
				])

(4)$sort 排序处理

db.stu.aggregate([
				    {$match : {hometown : {$nin : ["汉"]}}},
				    {$group : {_id : "$hometown", sum_age : {$sum : "$age"}, avg_age : {$avg : "$age"}}},
				    {$project : {avg_age : 1, _id : false}},
				    # 对前一个管道的输出做排序处理, 先按 avg_age升序处理,如果有重复值,再按_id 降序处理
				    {$sort : {avg_age : 1, _id : -1}}
				])

(5)$limit 和 $skip

在 aggregate 聚合运算里,limit 和 skip 顺序严格遵循

db.stu.aggregate([
				    {$match : {hometown : {$nin : ["汉"]}}},
				    {$group : {_id : "$hometown", sum_age : {$sum : "$age"}, avg_age : {$avg : "$age"}}},
				    {$project : {avg_age : 1}},
				    {$sort : {avg_age : 1, _id : -1}},
				    # 显示显示2个
				    {$limit : 2},
				    # 跳过1个开始显示
				    {$skip : 1}
				])

(6)$unwind

对数组字段的值进行拆分,返回拆分后的 多条文档数据
如果字段值为空数组、null,则默认不做处理

db.stu.aggregate([
					# 显示出组中的所有字段
				    {$group : {_id : "$gender", sum_age : {$sum : "$age"}, all_name : {$push : "$name"}}},
				    # 对all_name字段进行拆分显示
				    {$unwind : "$all_name"}
				])

MongoDB的索引操作

首先向data集合中写入10万条数据

	for(i=0; i<100000; i++)
	{
		db.data.insert({_id: i, name: "name"+i, age: 10+i})
	}

(1)查看find()执行状态

db.data.find({_id: 10249}).explain("executionStats")

(2)查看当前集合里的所有索引

db.data.getIndexes()

(3)创建索引(默认_id字段是索引)

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

(4)删除索引(注意删除索引时候的索引名,可以通过getIndexs()获取)

db.data.dropIndex("name_1")

MongoDB的数据导出和导入(以集合为单位)

(1)默认导出为json,通过 --type 指定csv并 -f指定字段

# 导出为json格式
sudo mongoexport -d test -c stu -o ./stu.json

# 导出为csv格式
sudo mongoexport -d test -c stu -o ./stu.csv --type csv -f  "_id,name,age,hometown,gender"

(2)默认按json导入

sudo mongoimport -d test -c stu --file ./stu.json

MongoDB的数据 备份 和 恢复 (以数据库为单位)

(1)备份数据

# 将 -h 指定的 MongoDB服务器的 -d 指定的数据库,备份到 -o 指定的本地目录里,会生成以数据库为名的目录
sudo mongodump -h 192.168.40.71 -d test -o ./test_data/

(2) 恢复数据

# 将 --dir 指定的本地数据库文件数据,恢复到 -h 指定的MongoDB服务器的 -d 指定的数据库
mongorestore -h 192.168.40.71 -d test --dir ./test_data/test
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值