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