MongoDB学习(查找文档和其他数据查找操作)
理解Cursor对象和查询运算符
cursor对象
cursor对象相当于一个指针,可通过迭代它来访问MongdoDB数据库中的一组对象。
在使用 find() 方法查询时,返回的并非实际文档,而是一个Cursor对象,也就是一个指向第一个数据之前的指针。
Cursor对象内部存储了一个指向当前位置的索引,可以保证每次读取一个文档。在MongoDB中,有些操作只影响Cursor中的当前文档,并将索引数加 1,而有些操作影响当前索引之后的所有文档。


查询运算符
在进行查找时,可以使用一些查询运算符来进行查询匹配。以来判断文档中字段的值是否符合指定的条件。类似与 sql 语句中 where 查询后面的条件。
| 运算符 | 描述 | 示例 |
| field:value | 与字段值为value的文档匹配 | { name : "myName" } |
| $gt | 与字段值大于指定值的文档匹配 | { size : { $gt : 5 } } |
| $gte | 与字段值大于等于指定值的文档匹配 | { size : { $gte : 5 } } |
| $in | 与字段值包含在指定数组中的文档匹配 | { like : { $in : [ "C","JAVA" ] } } |
| $lt | 与字段值小于指定值的文档匹配 | { size : { $lt : 5} } |
| $lte | 与字段值小于等于指定值的文档匹配 | { size : { $lte : 5 } } |
| $ne | 与字段值不等于指定值的文档匹配 | { name : {$ne : "badName"} } |
| $nin | 与字段值不包含在指定数组中的文档匹配 | { name : { $nin : ["html","css"] } } |
| $or | 使用逻辑或连接查询字句,并返回符合任何一个字句条件的文档 | { $or : [ {size : {$lt : 5} }, {size : {$gt : 10} } ] } |
| $and | 使用逻辑与连接查询字句,并返回与两个字句条件都匹配的文档 | { $and : [ { size : { $gt : 5 } },{ size : { $lt : 10 } } ] } |
| $not | 反转查询表达式的效果,返回与查询表达式不匹配的文档 | { $not : { name : "myName" } } |
| $nor | 使用逻辑或非连接查询字句,返回与两个字句都不匹配的文档 | { $nor : { size : { $gt : 5 } },{ size : { $lt : 0 } } } |
| $exists | 值为 true 时匹配包含指定字段的文档,为 false 时返回不包含该字段的文档 | { name : { $exists : true } } |
| $regex | 返回指定字段的值与指定正则表达式匹配的文档 | { myString : { $regex : ' some.*exp ' } } |
| $all | 返回指定数组包含所有指定的元素的文档 | { word : { $all : [ 'a','b','c' ] } } |
| $elemMatch | 返回指定的数组字段至少有一个元素与指定的条件都匹配的文档 | { myArr : { $elemMatch : { { value : { $gt : 5 } },{ size : { $lt : 10 } } } } } |
| $size | 指定数组的长度 | { myArr : { $size : 5 } } |
查询文档
find() 方法
查询集合中的文档可以用 find() 方法进行查询,其语法为
find( query, projection)
- query :可选,使用查询操作符指定查询条件
- projection :可选,使用投影操作符指定返回的键。查询时返回文档中所有键值, 只需省略该参数即可(默认省略)。
find() 方法返回一个 find()Cursor对象,表示与查询条件匹配的文档。
function (query, fields, limit, skip, batchSize, options) {
var cursor = new DBQuery(this._mongo,
this._db,
this,
this._fullName,
this._massageObject(query),
fields,
limit,
skip,
batchSize,
options || this.getQueryOptions());
{
const session = this.getDB().getSession();
const readPreference = session._serverSession.client.getReadPreference(session);
if (readPreference !== null) {
cursor.readPref(readPreference.mode, readPreference.tags);
}
const readConcern = session._serverSession.client.getReadConcern(session);
if (readConcern !== null) {
cursor.readConcern(readConcern.level);
}
}
return cursor;
}
示例:

findOne()方法
它的用法与 find() 相同,只是 findOne() 只返回与查询条件匹配的第一个文档。
示例:

根据多个字段查询文档
根据多个字段进行查询时,可以将多个查询字段放在一个文档中查询,或者使用 $and 连接符进行连接。


注意:根据多个字段查询文档时,若将多个字段放在多个文档中查询时,只能根据第一个文档查询出数据。第二个文档会作为另一个可选参数(投影)。

根据子文档查询
根据子文档的字段值进行查询时,可用 find( { " 子文档.子文档字段 " :value } ) 方法进行查询。
示例:
{
"_id" : ObjectId("5ca86917e8717d2b3f6e21e3"),
"name" : "张三",
"age" : 18,
"father" : {
"name" : "uzi",
"age" : 24
}
}
{
"_id" : ObjectId("5ca86917e8717d2b3f6e21e4"),
"name" : "李四",
"age" : 19,
"father" : {
"name" : "letme",
"age" : 25
}
}
{
"_id" : ObjectId("5ca86917e8717d2b3f6e21e5"),
"name" : "王五",
"age" : 20,
"father" : {
"name" : "zitai",
"age" : 26
}
}
集合中的数据


注意字段值为null
在文档中尽量不要将值赋为null,因为进行null查询时(例如name=null),不仅会返回name值为null的文档,也会将不包含name字段的文档返回。所以应尽量避免使用null值,而应不包含这样的字段,这样就可以使用 $exists运算符进行不包含查询了。
其他数据查找操作
计算文档数
查询集合中的文档数时,可使用 db.collection_name.count() 进行计算。

若想查询符合条件的文档数时,可使用 db.collection_name.find().count() 进行计算。

对结果集进行排序
在MongoDB中对结果集进行排序时,可以用Cursor对象的 sort() 方法。sort() 方法可以按照字段的值进行升降排序。1 为升序, -1 为降序。
该方法返回的也是一个Cursor对象,可以继续使用Cursor对象的其他方法,如limit() 等。
示例:
db.num.find().sort({a:1})
限制结果集的大小
在MongoDB中想要限制结果集的数据量,可以调用Cursor对象的 limit() 方法。他可以让Cursor对象返回指定数量的文档。
该方法返回的也是一个Cursor对象,可以继续使用CUrsor对象的其他方法。
limit(number) 方法接受一个数字类型参数,即要显示的文档数。
db.collection_name.find().limit(number)
限制返回的字段(投影)
为了限制文档检索时返回的数据量,只获得有用的信息,抛除无效信息,可以通过find() 方法的第二个可选参数 projection参数。
在MongdoDB中使用 find() 方法时,默认是显示文档中的所有字段。可以通过给字段赋 1/true 表示包含,赋 -1/false 表示排除。
当字段包含时,只会显示包含的字段;当字段排除时,会显示出排除外的所有字段。但是在同一个表达式中,不能同时指定包含和排除。
示例:
db.student.find({},{name:1})

结果集分页
为减少返回的文档数,可以对结果集进行分页。跳过部分文档,直接显示后面的部分文档。
要进行分页显示可以用 Cursor对象的 limit() 方法和 skip() 方法。
skip() 方法可以指定在返回文档前跳过多少个文档。
db.collection_name.find().skip(number).limit(number)
对数据进行分页时,可以调用方法 sort() 来确保数据的排列顺序不变。
返回某个字段的值
在MongoDB中,可以获取一组文档中某个字段的不同值列表。
Collection对象的 distinct() 方法可以找出指定字段的不同值列表。这种方法的语法为:
db.collection_name.distinct( key,[query] )
- key:指定要获得值的字段
- query:表示查询条件。
示例:

$type操作符
$type操作符是基于BSON类型来检索集合中匹配的数据类型,并返回结果。
示例:
想要获取name值为string类型的数据,可以使用命令
db.aaa.find({"name":{$type:2}})
或
db.aaa.find({"name":{$type:'string'}})

MongoDB学习(查找文档和其他数据查找操作)的更多相关文章
- MongoDB学习笔记——文档操作之增删改
插入文档 使用db.COLLECTION_NAME.insert() 或 db.COLLECTION_NAME.save() 方法向集合中插入文档 db.users.insert( { user_id ...
- MongoDB学习笔记——文档操作之查询
查询文档 使用db.COLLECTION_NAME.findOne()可以查询所有满足条件的第一条数据 预发格式如下: db.COLLECTION_NAME.findOne(<query> ...
- Mongoose学习参考文档——基础篇
Mongoose学习参考文档 前言:本学习参考文档仅供参考,如有问题,师请雅正 一.快速通道 1.1 名词解释 Schema : 一种以文件形式存储的数据库模型骨架,不具备数据库的操作能力 Model ...
- 《Java开发学习大纲文档》V7.0
<Java开发学习大纲文档>V7.0简介: 本文档是根据企业开发所需要掌握的知识点大纲进行总结汇编,是Java开发工程师必备知识体系,系统化学习针对性非常强,逻辑分析能力非常清晰;技术方面 ...
- SpringMVC MongoDB之“基本文档查询(Query、BasicQuery)”
一.简介 spring Data MongoDB提供了org.springframework.data.mongodb.core.MongoTemplate对MongoDB的CRUD的操作,上一篇我 ...
- L18 如何快速查找文档获得帮助
原地址:http://www.howzhi.com/course/286/lesson/2121 查找文档快速 苹果提供了丰富的文档,以帮助您成功构建和部署你的应用程序,包括示例代码,常见问题解答,技 ...
- Excel文档间的数据替换 ---电脑版APP 自动操作魔法师
http://www.won-soft.com/macro/solution/excel-data-replace.htm 介绍: 在我们的日常工作中, 可能经常需要使用同各种数据表格打交道.比如财务 ...
- 《Java开发学习大纲文档》V8.0
<Java开发学习大纲文档>V8.0 第八版是以实战作为核心,同时也包含前面所有版本的精华部分,第八版加入的部分有云开发(阿里云OSS存储.(github)gitlab+docker网站自 ...
- 从多个XML文档中读取数据用于显示webapi帮助文档
前言: 你先得知道HelpPageConfig文件,不知道说明你现在不需要这个,所以下文就不用看了,等知道了再看也不急.当然如果你很知道这个,下文也不用看了,因为你会了. 方法一: new XmlDo ...
随机推荐
- Apache Mina -2
我们可以了解到 mina是个异步通信框架,一般使用场景是服务端开发,长连接.异步通信使用mina是及其方便的.不多说,看例子. 本次mina 使用的例子是使用maven构建的,过程中需要用到的jar包 ...
- LVM 移除PV步骤
1.先查看需要收缩文件系统的使用情况,收缩后的文件系统空间不能小于已经使用的空间 df -hT 2.卸载需要收缩的文件系统(以/dev/vg0/lvm1为例) umount /dev/vg0/lvm1 ...
- 带你由浅入深探索webpack4(一)
相信你或多或少也听说过webpack.gulp等这些前端构建工具.近年来webpack越来越火,可以说成为了前端开发者必备的工具.如果你有接触过vue或者react项目,我想你应该对它有所了解. 这几 ...
- .NET Core中使用AutoMapper
何为AutoMapper AutoMapper是对象到对象的映射工具.在完成映射规则之后,AutoMapper可以将源对象转换为目标对象. 安装AutoMapper 这里我们在NuGet中下载安装Au ...
- 你真的了解字典(Dictionary)吗?
从一道亲身经历的面试题说起 半年前,我参加我现在所在公司的面试,面试官给了一道题,说有一个Y形的链表,知道起始节点,找出交叉节点. 为了便于描述,我把上面的那条线路称为线路1,下面的称为线路2. 思路 ...
- 目标检测之YOLO V2 V3
YOLO V2 YOLO V2是在YOLO的基础上,融合了其他一些网络结构的特性(比如:Faster R-CNN的Anchor,GooLeNet的\(1\times1\)卷积核等),进行的升级.其目的 ...
- java接口与抽象类
本片随笔讲讲java中接口与抽象类. 一,接口 1.什么是接口? 那在日常生活中接口是什么呢?就是两个对象之间进行连接的部分就是接口,就比如热水器与水管的接口一样,他可以确保不同的东西之间的顺利连接, ...
- Android8.0通知
android里面经常会使用Notification来显示通知的消息,一般使用NotificationManager来创建通知消息 NotificationManager manger = (Noti ...
- 如何快速掌握DDT数据驱动测试?
1.前言 (网盗概念^-^)相同的测试脚本使用不同的测试数据来执行,测试数据和测试行为完全分离, 这样的测试脚本设计模式称为数据驱动.(网盗结束)当我们测试某个网站的登录功能时,我们往往会使用不同的用 ...
- eShopOnContainers 知多少[3]:Identity microservice
首先感谢晓晨Master和EdisonChou的审稿!也感谢正在阅读的您! 引言 通常,服务所公开的资源和 API 必须仅限受信任的特定用户和客户端访问.那进行 API 级别信任决策的第一步就是身份认 ...