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

news/2024/6/15 1:28:57 标签: mongodb, 数据库

个人博客

整理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.niftyadmin.cn/n/4934125.html

相关文章

【ARM 嵌入式 编译系列 4.1 -- GCC 编译属性 likely与unlikely 学习】

文章目录 GCC likely与unlikely 介绍linux 内核中的 likely/unlikely 上篇文章:ARM 嵌入式 编译系列 4 – GCC 编译属性 __read_mostly 介绍 下篇文章: ARM 嵌入式 编译系列 4.2 – GCC 链接规范 extern “C“ 介绍 GCC likely与unlikely 介绍 likely 和 unlikely …

PCL Visualizer可视化结果保存成图片、关闭可视化窗口

目录 1.1 点云可视化显示1.2 保存可视化结果1.3 关闭可视化窗口1.4 完整示例如下内容: C++ PCLVisualizer可视化的结果保存成图片,并自动关闭可视化窗口。 1.1 点云可视化显示 #include <iostream> #include <pcl\io\pcd_io.h> #include

Vue组件的嵌套关系;父组件传递子组件props;子组件传递给父组件$emit;自定义事件;案例

目录 1_Vue组件的嵌套关系1.1_认识组件的嵌套1.2_组件的拆分1.3_组件的通信 2_父组件传递子组件props2.1_父子组件之间通信的方式2.2_父组件传递给子组件2.3_Props的对象用法 3_子组件传递给父组件$emit4_自定义事件(了解)5_小案例6_补充 1_Vue组件的嵌套关系 1.1_认识组件的嵌…

Matlab时频工具箱tftb下载及安装

Matlab 时频工具箱下载及安装 首先下载安装包安装包地址如下 链接: https://tftb.nongnu.org/ 点击下面的download 跳转到如下界面&#xff0c;选择下面的安装包下载 下载之后得到一个压缩包 然后找到Matlab的安装目录&#xff0c;右键桌面图标&#xff0c;打开文件所在位置…

C#,数值计算——Dynpro的计算方法与源程序

给定向量nstate&#xff0c;其整数值是每个状态中的状态数阶段&#xff08;第一和最后阶段为1&#xff09;&#xff0c;并给定函数成本&#xff08;j&#xff0c;k&#xff0c;i&#xff09;返回在阶段i的状态j和的状态k之间移动的成本阶段i1&#xff0c;此例程返回与nstate长度…

【Freertos基础教程】任务管理之基本使用

文章目录 前言一、freertos任务管理是什么&#xff1f;二、任务管理涉及到的一些概念1.任务状态2.优先级3.栈(Stack)4.事件驱动5.协助式调度(Co-operative Scheduling) 二、任务的基本操作1.创建任务什么是任务 2.创建任务3.任务的删除4.任务的调度3.简单示例 总结 前言 本fre…

HTML详解连载(3)

HTML详解连载&#xff08;3&#xff09; 专栏链接 [link](http://t.csdn.cn/xF0H3)下面进行专栏介绍 开始喽表单作用使用场景 input标签基本使用示例type属性值以及说明 input标签占位文本示例注意 单选框 radio代码示例 多选框-checkbox注意代码示例 文本域作用标签&#xff1…

【WMware】WMware16下载激活

WMware16下载激活 VMware-workstation-full-16.2.4-20089737 ZF3R0-FHED2-M80TY-8QYGC-NPKYF YF390-0HF8P-M81RQ-2DXQE-M2UT6 ZF71R-DMX85-08DQY-8YMNC-PPHV8