整理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实现轻量级WEB服务器接收HTTP提交的RFID刷卡信息并回应驱动读卡器显示播报语音

本示例使用的设备:RFID网络WIFI无线TCP/UDP/HTTP可编程二次开发读卡器POE供电语音-淘宝网 (taobao.com) # -*- coding: utf-8 -*- import time import datetime import socket import threading#将中文信息转换编码,显示文字、TTS语音都需要转换-------…

从入门到精通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…

iceberg系列之 hadoop catalog 小文件合并实战

背景 flink1.15 hadoop3.0pom文件 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://mave…

UBuntu18.04 Qt之双HDMI屏切换

UBuntu18.04 Qt之双HDMI接2个4K屏并分别设置分辨率、主屏、副屏 一、设置HDMI-2为主屏 在main函数里面添加&#xff1a; #include "mainwindow.h" #include <QApplication>int main(int argc, char *argv[]) {QApplication a(argc, argv);{long nTotal 0;c…

spring cloud gateway中配置uri

gateway中配置uri配置有三种方式: websocket方式&#xff1a;uri: ws://localhost:9000http方式: uri: http://localhost:8130/lb注册中心配置方式&#xff08;注册的服务名称&#xff09;: uri: lb://monitor-ms gateway的lb方式识别的服务名称命名规则&#xff1a; "[…

设计模式——适配器模式

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

Jtti:windows虚拟内存最小值太低如何解决

当Windows虚拟内存的最小值设置过低时&#xff0c;可能会导致系统性能下降、应用程序崩溃甚至系统不稳定。解决方法包括&#xff1a; 调整虚拟内存设置&#xff1a; 可以通过以下步骤调整虚拟内存的设置&#xff1a; 右键点击“此电脑”或“计算机”&#xff0c;选择“属性”。…

被迫学习一波Linux命令

事情起因 部署一个服务&#xff0c;人家说了最低配置是3G&#xff0c;我没当回事&#xff0c;拿着个2G的服务器直接就上了&#xff0c;结果&#xff0c;哈哈&#xff0c;都能猜到结果&#xff1a;服务器内存爆了&#xff01;&#xff01;&#xff01;而且最可气的是服务器还登…

ansible案列之LNMP分布式剧本

LNMP分布式剧本 一&#xff1a;环境设置二&#xff1a;编写Nginx剧本准备nginx下载源准备配置文件并开放PHP的访问路径准备php测试页面编写nginx剧本 三&#xff1a;编写Mysql剧本编写密码获取脚本准备Mysql的yum源编写mysql剧本 四&#xff1a;准备PHP剧本准备两个配置文件编写…

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

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

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

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

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

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

Ubuntu服务器service版本初始化

下载 下载路径 官网&#xff1a;https://cn.ubuntu.com/ 下载路径&#xff1a;https://cn.ubuntu.com/download 服务器&#xff1a;https://cn.ubuntu.com/download/server/step1 点击下载&#xff08;22.04.3&#xff09;&#xff1a;https://cn.ubuntu.com/download/server…

【Python百日进阶-Web开发-Peewee】Day271 - Peewee API文档 - 字段(二)

文章目录 11.3.17 class UUIDField11.3.18 class BinaryUUIDField11.3.19 class DateTimeField11.3.20 class DateField11.3.21 class TimeField11.3.22 class TimestampField11.3.23 class IPField11.3.24 class BooleanField11.3.25 class BareField11.3.26 class ForeignKey…

神经网络基础-神经网络补充概念-06-计算图

概念 “计算图”&#xff08;Computational Graph&#xff09;是一种用于表示数学表达式计算过程的图结构&#xff0c;广泛用于深度学习和自动微分等领域。计算图将复杂的数学表达式分解为一系列简单的计算节点&#xff0c;这些节点之间通过边连接&#xff0c;形成了一个有向无…