![MongoDB进阶与实战:微服务整合、性能优化、架构管理](https://wfqqreader-1252317822.image.myqcloud.com/cover/697/38209697/b_38209697.jpg)
2.4 查询文档
2.4.1 查询全部数据
db.collection.find方法可以用于集合数据的查询,代码如下:
![](https://epubservercos.yuewen.com/6F449D/20118171608699906/epubprivate/OEBPS/Images/40827_39_2.jpg?sign=1739307683-kFZi3Tn9mOHTzOvaVemXPbkkKfZzgFf8-0-3d0df18c43cc37910edc39277818cf81)
如果查询返回的条目数量较多,mongo shell则会自动实现分批显示。默认情况下每次只显示20条,可以输入it命令读取下一批。
实际上,find命令返回的是一个游标(cursor)对象,mongo shell对batchSize做了限定,该大小可通过变量DBQuery.shellBatchSize修改。
使用游标对象提供的API,可以对全部结果集进行遍历,代码如下:
![](https://epubservercos.yuewen.com/6F449D/20118171608699906/epubprivate/OEBPS/Images/40827_39_3.jpg?sign=1739307683-TcudwRKNEVwBQsnVBFlE6bIypAbEwjBe-0-1f7466b75f814cf75b7958cc2471d135)
2.4.2 指定条件查询
例A,查询带有“mongodb”标签的book文档:
![](https://epubservercos.yuewen.com/6F449D/20118171608699906/epubprivate/OEBPS/Images/40827_40_1.jpg?sign=1739307683-lLxSSsLhbBjrtJZKNOSis4IUiDto7Szo-0-66cb1060f907966eef5c44ded9205eb1)
例B,查询分类为“novel”的book文档:
![](https://epubservercos.yuewen.com/6F449D/20118171608699906/epubprivate/OEBPS/Images/40827_40_2.jpg?sign=1739307683-dKR59AKdxzHxKzEjLd337dZMSwMJM5aH-0-13bc91b94cc7258ccce1c1a71c62f0bf)
例C,按照id查询单个book文档:
![](https://epubservercos.yuewen.com/6F449D/20118171608699906/epubprivate/OEBPS/Images/40827_40_3.jpg?sign=1739307683-fa73WBysfjSlTP2hQoH9HSI0e42MHyHc-0-432893a6466bc9ff4cf34877a574099a)
例D,查询分类为“literature”、收藏数超过10个的book文档:
![](https://epubservercos.yuewen.com/6F449D/20118171608699906/epubprivate/OEBPS/Images/40827_40_4.jpg?sign=1739307683-GDJIkeaG1ovSsx591c6YMsDPxRTnFD1r-0-06c837563e2aff7718051b81a6d99177)
2.4.3 排序、分页
(1)指定排序
如果不指定排序条件,MongoDB则会默认按物理顺序返回,这里我们可以指定按出版时间(publishedDate)降序返回,代码如下:
![](https://epubservercos.yuewen.com/6F449D/20118171608699906/epubprivate/OEBPS/Images/40827_40_5.jpg?sign=1739307683-dZvhWJ5BNzl8cmMae18plA4GuZaQEHwp-0-2b104a0b7e79be473aad0abc1dc11b06)
(2)分页查询
skip用于指定跳过记录数,limit则用于限定返回结果数量。
可以在执行find命令的同时指定skip、limit参数,以此实现分页的功能。比如,假定每页大小为8条,查询第3页的book文档,代码如下:
![](https://epubservercos.yuewen.com/6F449D/20118171608699906/epubprivate/OEBPS/Images/40827_40_6.jpg?sign=1739307683-MZsTbc09oNQWIJI3DOTKIC1ssXPm6G3D-0-1c1932f460c46302dfb4462eddeb9a67)
在find命令中使用limit=1,可以明确限定返回文档的数量,除此之外还可以使用另一个快捷方法:findOne。
![](https://epubservercos.yuewen.com/6F449D/20118171608699906/epubprivate/OEBPS/Images/40827_40_7.jpg?sign=1739307683-6VGnP7mK6xGeNQTH3VWF9zgI9BIaKAvZ-0-008024912d85e118606d1f48207e2747)
2.4.4 使用投射
投射(projection)可以让数据库只返回一部分被关注的字段,而不是整个文档。
比如,可以让数据库仅仅返回book文档中的标题(title)、收藏数(favCount)字段,代码如下:
![](https://epubservercos.yuewen.com/6F449D/20118171608699906/epubprivate/OEBPS/Images/40827_41_1.jpg?sign=1739307683-4FmtanuLBwJNpHlZe2UbwFQccJGjYZIY-0-68ef0e42121617c63742f7c38b30aedd)
默认情况下,_id会被一起返回,可以在projection参数中明确将其去除,代码如下:
![](https://epubservercos.yuewen.com/6F449D/20118171608699906/epubprivate/OEBPS/Images/40827_41_2.jpg?sign=1739307683-njIiUHFD9B4vZz2LwUoAOEV5Wh7e1yLu-0-ab421159b6673169c55d1a5a396962be)
2.4.5 查询限定符
比较操作符见表2-5。
表2-5 比较操作符
![](https://epubservercos.yuewen.com/6F449D/20118171608699906/epubprivate/OEBPS/Images/40827_41_3.jpg?sign=1739307683-09l4gCII6ghsjRXkrQdn1nxGRwvnMXV1-0-532ef7b66bb40778616a973634bbefb3)
逻辑操作符见表2-6。
表2-6 逻辑操作符
![](https://epubservercos.yuewen.com/6F449D/20118171608699906/epubprivate/OEBPS/Images/40827_42_1.jpg?sign=1739307683-XypNy2l4KCIqo9iIlfXpB27BhYvOGom8-0-c8cc9ef1f15dc555d2aea201ba4d4e14)
数组操作符见表2-7。
表2-7 数组操作符
![](https://epubservercos.yuewen.com/6F449D/20118171608699906/epubprivate/OEBPS/Images/40827_42_2.jpg?sign=1739307683-hwcY1qVjDofMp3Ut7hGQrfLKwhu6KsNS-0-cd3236d4c65356359f5e310170166f28)