MongoDB数据库学习(二)

本文详细介绍了MongoDB的高级操作技巧,包括数据筛选、投影、去重、数组字段拆分、索引创建及备份恢复等核心功能,助力开发者高效管理和查询数据。

一、limit与skip
limit:
方法limit():用于读取指定数量的文档
语法:
db.集合名称.find().limit(NUMBER)
参数NUMBER表示要获取文档的条数
如果没有指定参数则显示集合中的所有文档
例1:查询2条学生信息
db.stu.find().limit(2)

skip:
方法skip():用于跳过指定数量的文档
语法:
db.集合名称.find().skip(NUMBER)
参数NUMBER表示跳过的记录条数,默认值为0
例1:查询从第3条开始的学生信息
db.stu.find().skip(2)
(方法limit()和skip()可以一起使用,不分先后顺序)

创建数据集 :
for(i=0;i<15;i++){
db.t1.insert({_id:i})
}
查询第5至8条数据
db.stu.find().limit(4).skip(5)

db.stu.find().skip(5).limit(4)

二、MongoDB投影
定义:在查询到的返回结果中,只选择必要的字段,而不是选择一个文档的整个字段

如:一个文档有5个字段,需要显示只有3个,投影其中3个字段即可
语法:
参数为字段与值,值为1表示显示,值为0不显示
db.集合名称.find({},{字段名称:1,…})

对于需要显示的字段,设置为1即可,不设置即为不显示
特殊:对于_id列默认是显示的,如果不显示需要明确设置为0例1db.stu.find({},{name:1,gender:1})
例2db.stu.find({},{_id:0,name:1,gender:1})

三、MongoDB消除重复
方法distinct()对数据进行去重
语法
db.集合名称.distinct(‘去重字段’,{条件})

例:查找年龄大于18的学生,来自哪些省份
db.stu.distinct(‘hometown’,{age:{$gt:18}})

四、unwind的深入理解
将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值

语法1—
对某字段值进行拆分
db.集合名称.aggregate([{ u n w i n d : ′ unwind:' unwind:字段名称’}])
构造数据
db.t2.insert({_id:1,item:‘t-shirt’,size:[‘S’,‘M’,‘L’]})
查询
db.t2.aggregate([{ u n w i n d : ′ unwind:' unwind:size’}])

语法2—
对某字段值进行拆分
处理空数组、非数组、无字段、null情况
属性preserveNullAndEmptyArrays值为false表示丢弃属性值为空的文档
属性preserveNullAndEmptyArrays值为true表示保留属性值为空的文档
db.inventory.aggregate([{
KaTeX parse error: Expected '}', got 'EOF' at end of input: … path:'字段名称’,
preserveNullAndEmptyArrays:#防止数据丢失
}
}])
构造数据
db.t3.insert([
{ “_id” : 1, “item” : “a”, “size”: [ “S”, “M”, “L”] },
{ “_id” : 2, “item” : “b”, “size” : [ ] },
{ “_id” : 3, “item” : “c”, “size”: “M” },
{ “_id” : 4, “item” : “d” },
{ “_id” : 5, “item” : “e”, “size” : null }
])
使用语法1查询
db.t3.aggregate([{ u n w i n d : ′ unwind:' unwind:size’}])
查看查询结果,发现对于空数组、无字段、null的文档,都被丢弃了
问:如何能不丢弃呢?
答:使用语法2查询
db.t3.aggregate([{KaTeX parse error: Expected '}', got 'EOF' at end of input: unwind:{path:'size’,preserveNullAndEmptyArrays:true}}])

五、MongoDB索引
在mysql中已经学习了索引,并知道索引对于查询速度的提升
mongodb也支持索引,以提升查询速度

步骤一:创建大量数据
在命令行中执行如下代码,向集合中插入10万条文档
注意:不要在图形界面中执行,因为软件原因无法插入10万条数据就会中断执行for(i=0;i<100000;i++){
db.t1.insert({name:‘test’+i,age:i})
}

步骤二:数据查找性能分析
查找姓名为’test10000’的文档
db.t1.find({name:‘test10000’})
使用explain()命令进行查询性能分析
db.t1.find({name:‘test10000’}).explain(‘executionStats’)
其中的executionStats下的executionTimeMillis表示整体查询时间,单位是毫秒

步骤三:建立索引
创建索引
1表示升序,-1表示降序
db.集合.ensureIndex({属性:1})

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

步骤四:对索引属性查询
执行上面的同样的查询,并进行查询性能分析
db.t1.find({name:‘test10000’}).explain(‘executionStats’)

六、备份与恢复
备份:
语法:mongodump -h dbhost -d dbname -o dbdirectory
-h:服务器地址,也可以指定端口号
-d:需要备份的数据库名称
-o:备份的数据存放位置,此目录中存放着备份出来的数据

例1sudo mkdir test1bak
sudo mongodump -h 192.168.196.128:27017 -d test1 -o ~/Desktop/test1bak

恢复:
语法:mongorestore -h dbhost -d dbname --dir dbdirectory
-h:服务器地址
-d:需要恢复的数据库实例
–dir:备份数据所在位置

例1mongorestore -h 192.168.196.128:27017 -d test2 --dir ~/Desktop/test1bak/test1

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值