整理mongodb文档:find方法查询数据

个人博客

整理mongodb文档:find方法查询数据
求关注,求批评,求指出,如果哪儿不清晰,请指出来,谢谢

文章概叙

如题,本文讲的是如何用find查询数据,如何在数组、字段、对象中查询,以及‘或’等查询操作,最后讲了一些参数。依旧是在shell下操作。

数据准备

查询数据是db操作中很重要的一步,而mongodb又是Nosql的代表。所以,准备了两条数据,分别是有string,array,number,object的,方便后面的操作以及讲解。

[{"string": "str1","num": 1,"obj": { 'name1': 'value1' },"arr": ["arr11", 'arr12']
},
{"string": "str2","num": 2,"obj": { 'name2': 'value2' },"arr": ["arr21", 'arr22']
}]

find

Selects documents in a collection or view and returns a cursor to the
selected documents.

大概意思就是选择集合或视图中的文档,并将光标返回到所选文档。

首先来个最简单的用法,直接使用find方法查询出所有的数据,让大家有个直观的了解

db.test.find()

在这里插入图片描述

数据查询成功,但是这样子我们查询出来的是整个表的数据,实际开发中很少这样子做。毕竟一个表几个亿的数据是很正常的,而我们再看下文档中关于find方法的描述

在这里插入图片描述

看出来,有两个参数,第一个是我们的查询条件,第二个是我们的返回字段操作

字段查询

假定一个例子,我们只需要查询出num为1的数据,那么我们可以这样子

db.test.find({ num: 1 })

在这里插入图片描述

这样子,我们就查询出了我们想要的那条数据,而如果存在多条数据的num都为1,我们可以再增加一些查询的条件,如下:

db.test.find({num: 1,string: 'str1'
})

这样子的意思,就是查询string为str1,并且num为1的数据。相当于我们的‘并’查询,既然有‘并’查询,那么就有‘或’查询,假设我们要查询num为1或则2的数据,我们的查询条件可以这么写:

db.test.find({"$or": [{ num: 1 }, { num: 2 }]
})
db.test.find({num: { "$in": [1, 2] }
})

根据字面意思,第一个sql的意思是一个‘或’操作,其中满足num为1或则2的时候,而第二个sql的意思则是如果num这个字段是在我们的1,2这两个之间的时候返回,两者实现的效果是一样的,但是可以看到or的操作是先把操作符放在外层,然后再将可能的条件列举出来,而in的操作是具体对某个字段的操作。这两个的用法需要注意下。

讲述完了"$or"的用法,接下里再讲解下如果必须加入其他条件以及正则的使用,正则的使用很重要,在我们做sql查询的时候,我们要匹配数据经常用到。

举个例子,现在我们还需要string字段为‘1’结尾的,sql应该如下:

db.test.find({string:/1$/,"$or": [{ num: 1 }, { num: 2 }]
})

有正则经验的朋友可以理解出,/1$/是正则的写法,意思就是1结尾,上述的sql是满足string以1结尾,且存在num为1或则num为2的情况。
在这里插入图片描述

讲解完了’ o r ′ 以 及 ′ or'以及' orin’这两个比较重要的,还有正则的,剩下的是’ l t ′ 、 ′ lt'、' ltgt’等用法,这个建议大家自己按照我的例子去敲一下。官网有很明确的文档讲到这几个的作用,当然,不大明确的,可以在下面跟我留言。我给个链接(最主要希望大家自己学习怎么查找文档)。

对象查询

字段的查询是最简单的,基本只要用键值对的形式查询就可以,但对于新手来说,对象查询肯定会一脸懵逼,下面就用一个sql讲解如何使用对象查询

db.test.find({"obj.name1": "value1"
})

在这里插入图片描述

可以看到,与上面的字段查询相比,我们将原来的‘string’变成了’obj.name1’,然后就查出了obj中name为value1的那条数据,看…多简单。

数组查询

本质上来说,对象跟数组是没有区别的,因为数组也是对象的一种,一种key为数字,但是被我们"忽略"掉的key,所以我们使用也可以使用

db.test.find({"arr.0": "arr1"
})

这样子看起来很奇怪,但是能不能查询出我们刚刚那条数据呢?很明显,是可以的
在这里插入图片描述

但是我们实际开发中怎么保证数组的第一个数据(key为0的那条)是arr11呢?所以我们一般会用下面的方法去查询

db.test.find({"arr": "arr11"
})

在这里插入图片描述

没啥好解说的,非要理解,就是遍历,查看每一条的arr字段,看看是不是数组类型,是的话就看看有没有arr11这个值这样子。

字段筛选

讲解完了查询的条件,就轮到了字段的筛选了,举一个例子,我们只需要返回string这个字段,那么我们可以用下面的sql

db.test.find({ string: "str1" },{ string: 1 }
)

第一个参数我们之前讲过了,也就是查询的条件,这儿的意思是只要string的值为str1的数据。
第二个参数的意思是返回string参数,其中有两个值,分别是1和0。1代表的是要返回,0代表的是不要返回。
在这里插入图片描述

这儿可以看到,虽然没有设置,但是还是返回了_id,毕竟人家是唯一id,比较牛逼,所以有点特权很正常。那么按照上述所说的,我们不想要返回_id,可以设置下面这样子

db.test.find({ string: "str1" },{ string: 1, "_id": 0 }
)

在这里插入图片描述

但是呢,部分朋友应该知道一条规则,就是0跟1是不能同时出现的,不然会出现很奇怪的情况,比如(我这儿是在很正经的科普mongodb,请不要想歪)

db.test.find({ string: "str1" },{"obj": 1,string:0}
)

在这里插入图片描述

意思就是你不能在进来的时候还出去。
除此之外,我们也可以使用下面这种情况

db.test.find({},{"obj.name1": 1,}
)

在这里插入图片描述

意思就是我只要返回obj对象的name1,这么做原因也很简单,部分人会将头像之类图片转化为base64,然后将字符串插入到db中,导致返回的数据过多的时候卡死,而这样做就可以让我们只拿到想要的数据。

collation

讲解完了mongodb的find方法,大家可能发现,我之前一直讲的参数collation在这儿好像没有了,但是collation的重要性又不言而喻,所以mongodb更不可能放弃它,尤其是在find这种最需要它的api中。所以这儿提一嘴如何使用collaion。

db.test.find().collation({ locale: 'simple' })

整理mongodb文档:collation

cursor

对于游标,我不大想介绍(我后面可能会写一个关于游标这个设计的博客,本文主要设计的是查询数据,我不想超过十分钟)。
大概理解为它是一个指针,就像是linux的软连接、c的指针,当我们拿到它的时候,它只是一串地址,指向那条我们想要的数据,当我们真正想要操作数据的时候,它会带我们去到那个文件的地方,是一个很棒的设计。
请记住一点,我们的数据都是在shell中找到的,所以我们返回的都是一个一个游标,具体请看上面所说的

Selects documents in a collection or view and returns a cursor to the
selected documents.

所以我们在代码中需要加一个toJSON或是toArray来将其转化,不过,我们更多是使用lean方法。
好消息是lean() 方法可以帮助我们获得更快的数据获取速度,因为它能够将 MongoDB 查询结果直接转化为 JavaScript 对象(或 JSON 字符串)而不需要创建 Mongoose 模型实例。

坏消息是lean只能在find方法中使用。

db.test.find().lean()

最后的啰嗦

增删改查,没有一个是不重要的,相对于聚合,索引,集群这些,对于新手增删改查是最重要的。希望大家能好好敲一遍代码或者看下项目里的代码!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/41431.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

自然语言处理技术:NLP句法解析树与可视化方法

自然语言处理(Natural Language Processing,NLP)句法解析树是一种表示自然语言句子结构的图形化方式。它帮助将句子中的每个词汇和短语按照语法规则连接起来,形成一个树状结构,以便更好地理解句子的语法结构和含义。句法解析树对于理解句子的句法关系、依存关系以及语义角…

从入门到精通Python隧道代理的使用与优化

哈喽,Python爬虫小伙伴们!今天我们来聊聊如何从入门到精通地使用和优化Python隧道代理,让我们的爬虫程序更加稳定、高效!今天我们将对使用和优化进行一个简单的梳理,并且会提供相应的代码示例。 1. 什么是隧道代理&…

SpringCloud Gateway:status: 503 error: Service Unavailable

使用SpringCloud Gateway路由请求时,出现如下错误 yml配置如下: 可能的一种原因是:yml配置了gateway.discovery.locator.enabledtrue,此时gateway会使用负载均衡模式路由请求,但是SpringCloud Alibaba删除了Ribbon的…

无涯教程-Perl - setpwent函数

描述 此功能将枚举设置(或重置)到密码条目集的开头。应该在第一次调用getpwent之前调用此函数。 语法 以下是此函数的简单语法- setpwent返回值 此函数不返回任何值。 例 以下是显示其基本用法的示例代码- #!/usr/bin/perlwhile(($name, $passwd, $uid, $gid, $quota, …

C++写文件,直接写入结构体

C写文件,直接写入结构体 以前写文件都是写入字符串或者二进制再或者就是一些配置文件,今天介绍一下直接写入结构体,可以在软件参数较多的时候直接进行读写,直接将整个结构体写入和读取,看代码: #include&…

tomcat中的BIO与NIO发展

tomcat中的NIO发展 前言 Tomcat目前支持BIO(阻塞 I/O)、NIO(非阻塞 I/O)、AIO(异步非阻塞式IO,NIO的升级版)、APR(Apache可移植运行库)模型,本文主要介绍NI…

设计模式——适配器模式

引入实例 说起适配器其实在我们的生活中是非常常见的,比如:学校的宿舍的电压都比较低,而有的学生想使用大功率电器,宿舍的就会跳闸,然而如果你使用一个适配器(变压器)就可以使用了(…

深入理解linux内核--块设备驱动程序

块设备的处理 块设备驱动程序上的每个操作都涉及很多内核组件;其中最重要的一些如图14-1所示。 例如,我们假设一个进程在某个磁盘文件上发出一个read()系统调用 ——我们将会看到处理write请求本质上采用同样的方式。 下面是内核对进程请求给予回应的一…

煤矿调度IP语音对讲广播模块一键求助对讲矿用调度通信系统SIP语音对讲求助终端

硬件接口描述 SV-2101VP/ SV-2103VP系列网络音频模块,所有外部连接采用端子,电源采用2.0mm的端子,网络采用标准RJ45连接器,其他都是1.25mm的连接器。 端口类型定义 P ———— 电源 AI ———— 模拟输入(在这里是音…

微信小程序前后端开发快速入门(完结篇)

这篇是微信小程序前后端快速入门完结篇了,今天利用之前学习过的所有知识做一个新的项目「群登记助手v1.0」小程序。 整体技术架构:小程序原生前端小程序云开发。 经历了前面教程的学习,大家有了一定的基础,所以本次分享重心主要是…

Ubuntu服务器service版本初始化

下载 下载路径 官网:https://cn.ubuntu.com/ 下载路径:https://cn.ubuntu.com/download 服务器:https://cn.ubuntu.com/download/server/step1 点击下载(22.04.3):https://cn.ubuntu.com/download/server…

【jwt】JWT原理,JWT是用来解决什么问题的,如何自定义生成JWT数据,并且实现jwt数据的解码

JWT: JSON Web Token 1. jwt概述 用户登录成功后,服务端 如何知道客户端的每次请求对应的是哪个用户呢?怎么做:目前有两种方式实现. 1.1. 一是通过sessionId的方式,登录成功后服务端返回sessionId给客户端&#xff0…

【数据结构】栈与队列

1 栈 1.1 栈的概念及结构 栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出 LIFO (Last In First Out) 的原则。 压栈:栈…

JupyterHub实战应用

一、JupyerHub jupyter notebook 是一个非常有用的工具,我们可以在浏览器中任意编辑调试我们的python代码,并且支持markdown 语法,可以说是科研利器。但是这种情况适合个人使用,也就是jupyter notebook以我们自己的主机作为服务器…

uni-app中监听网络状态,并在嵌入webView页面的组件中添加网络监测

uni-app中监听网络状态,并在嵌入webView页面的组件中添加网络监测 uni-app中监听网络状态 下载插件 打开网络异常组件页面,点击"下载插件并导入HBuilderX"按钮,打开HBuilderX软件后,选择需要导入插件的项目&#xff…

机器学习与模型识别1:SVM(支持向量机)

一、简介 SVM是一种二类分类模型,在特征空间中寻找间隔最大的分离超平面,使得数据得到高效的二分类。 二、SVM损失函数 SVM 的三种损失函数衡量模型的性能。 1. 0-1 损失: 当正例样本落在 y0 下方则损失为 0,否则损失为…

系统架构设计师-信息安全技术(1)

目录 一、信息安全基础 1、信息安全五要素 2、网络安全漏洞 3、网络安全威胁 4、安全措施的目标 二、信息加解密技术 1、对称加密 2、非对称加密 3、加密算法对比 三、密钥管理技术 1、数字证书 2、PKI公钥体系 四、访问控制技术 1、访问控制基本模型 2、访问控制的实现技术…

【Linux命令详解 | ssh命令】 ssh命令用于远程登录到其他计算机,实现安全的远程管理

文章标题 简介一,参数列表二,使用介绍1. 连接远程服务器2. 使用SSH密钥登录2.1 生成密钥对2.2 将公钥复制到远程服务器 3. 端口转发3.1 本地端口转发3.2 远程端口转发 4. X11转发5. 文件传输与远程命令执行5.1 文件传输5.1.1 从本地向远程传输文件5.1.2 …

深度学习入门-3-计算机视觉-图像分类

1.概述 图像分类是根据图像的语义信息对不同类别图像进行区分,是计算机视觉的核心,是物体检测、图像分割、物体跟踪、行为分析、人脸识别等其他高层次视觉任务的基础。图像分类在许多领域都有着广泛的应用,如:安防领域的人脸识别…

软考笔记——9.软件工程

软件工程的基本原理:用分阶段的生命周期计划严格管理、坚持进行阶段评审、实现严格的产品控制、采用现代程序设计技术、结果应能清除的审查、开发小组的人员应少而精、承认不断改进软件工程事件的必要性。 软件工程的基本要素:方法、工具、过程 软件生…