MongoDB 中存储数据的高级查询搜索(mongodb高级查询) – 第 4 部分

作者 : 慕源网 本文共2488个字,预计阅读时间需要7分钟 发布时间: 2022-01-4 共466人阅读

介绍

欢迎回到 MongoDB 文章系列 – 第 4 部分。在上一篇文章中,我们讨论了在 MongoDB 中搜索数据的不同过程。现在,在本文中,我们将讨论 MongoDB 数据库的高级搜索命令。如果您想阅读这些系列的前几篇文章,请点击链接。

在上一篇文章中,我们已经讨论了如何在 MongoDB 中执行基本类型的搜索操作。现在,在本文中,我们将讨论 MongoDB 中数据的高级查询。我们可以对数据库执行任何类型的即席查询以查找特定的数据组。此外,我们可以将范围运算符用于数据查询逻辑。在 MongoDB 中,每个查询命令都会返回一个游标,该游标基本上返回一批文档,因为我们提供了搜索条件。

游标

当我们在 MongoDB 中使用 find 方法时,它总是将结果作为游标返回。通过在查询中实现游标,我们可以很好地控制从数据库中获取的输出结果。我们可以操作结果总数,可以跳过结果中的一些数字,使用游标对结果进行任意组合排序。
要在 MongoDB shell 中定义游标,我们需要查询文档上的数据,然后将结果分配给局部变量(在 MongoDB 中,局部变量可以通过“var”关键字定义)。
var cursor = db.Employee.find()
定义游标的主要优点是我们可以一次分析所有结果。由于我们没有将数据分配给变量,因此 MongoDB shell 将自动在屏幕上显示文档。这是正常行为。但是,如果我们存储该结果,那么我们可以检查结果并根据需要表示输出。因此,要迭代数据,我们可以在游标上使用 next 方法。如果我们想检查任一变量是否包含任何数据,那么我们需要使用 hasNext 命令。同样,如果我们想移动到下一条记录,那么我们可以使用 next() 方法。

实际上,当我们调用 find 方法时,MongoDB shell 并没有与数据库进行数据通信。MongoDB shell 实际上一直等到我们开始通过发送查询来发送对结果的请求。现在,当我们执行命令 cursor.hasNext() 方法时,MongoDB shell 将查询发送到服务器。之后,shell 在单个请求中获取前 100 个结果或 4 MB 结果(以较小的大小为准),以便在下一次调用时 shell 执行相同的步骤来获取下一组记录。这个过程一直持续到游标耗尽或所有结果都已返回给查询。

Limit, Skip和Sorts

在MongoDB中,有几个命令可以用来正确地实现游标来获取数据,包括一些自定义的操作,如排序、跳过等。下表显示了可用于在MongoDB中实现游标的命令列表。
Operator 说明 例子
limit 此命令用于限制 find() 期间的记录数。此命令设置要显示的记录的上限。这意味着如果我们提供限制值为 5 并且根据条件提供总记录数为 4,那么查询将返回所有 4 条记录。 db.posts.find().limit(5)该命令返回文档列表,最多返回5个文档列表
skip 此命令的工作方式与限制类似。唯一的区别是它会跳过skip方法中提到的记录数,然后返回文档的结果。 db.posts.find().skip(5) 此命令返回文档列表,其中将跳过前 5 条记录,然后显示其余员工。
sort
该命令用于按指定顺序显示集合中的获取文档。使用这种方法,我们可以提供两个参数——一个是将被排序的字段名称或对象名称,第二个是顺序——1 表示升序,-1 表示降序。排序命令基本上保持了显示数据类型的预定义排序顺序
  1. 最小值
  2. 空值
  3. 数字(整数、长、双)
  4. 字符串
  5. 对象/文件
  6. 大批
  7. 二进制数据
  8. 对象 ID
  9. 布尔值
  10. 日期
  11. 时间戳
  12. 预订
  13. 日期。
db.posts.find().sort({“author”:1}) 该命令按照系统升序返回文档列表。

Immortal Cursor

实际上,在 MongoDB 中游标有两种类型——一种是面向客户端的游标,另一种是面向服务器的游标。到目前为止,我们只讨论了面向客户端的游标。现在,我们需要讨论光标面向服务器的方面。在服务器端,每个游标都占用内存和资源分配。一旦游标运行结果或客户端向服务器发送消息,数据库就会立即释放它正在使用的资源。通过释放这些资源,数据库可以执行其他操作。因此,最终可以快速从服务器中释放游标。
实际上,有几种情况会导致游标死亡。首先,当游标通过记录的匹配完成其迭代时,它会自行清理。另一种方法是当游标在客户端失去焦点时,驱动程序会向数据库发送一个关于游标的信号,表明它可以杀死该游标。最后,事件用户没有通过执行所有迭代来检索所有记录并且游标仍然存在于范围内,那么在不活动10分钟后,该数据库游标将自动死亡。此外,如果客户端崩溃,那么 MongoDB 将不会留下数千个打开的游标。

但有时,我们可能需要一个需要持续很长时间的游标。在这种情况下,许多 MongoDB 驱动程序实现了一个称为 immortal 的功能。这个游标主要告诉数据库不要让游标超时。如果我们不指定游标超时,那么我们需要通过使用重复游标迭代来获取所有数据,然后杀死这个游标以确保它被关闭。

数据库命令

数据库命令是另一种从 MongoDB 获取的特殊查询类型。我们已经讨论了插入、更新、删除和查找文档。这个命令可以做任何事情,比如“其他一切”可以通过使用服务器来完成。数据库命令执行“其他所有操作”,从管理任务(例如关闭服务器和克隆数据库)到对集合中的文档进行计数和执行聚合。本书通篇都提到了命令,因为它们对数据操作、管理和监控很有用。例如,删除集合是通过“drop”数据库​​命令完成的,
db.runCommand({  
    "drop": "test"  
});  
  
{  
  
    "nIndexesWas": 1,  
    "msg": "indexes dropped for collection",  
    "ns": "test.test",  
    "ok": true  
}  

在本节中,我们将仔细研究这些命令,以确切了解它们是什么以及它们是如何实现的。我们还将描述 MongoDB 支持的一些最有用的命令。您可以通过运行 db.listCommands() 命令查看所有命令。我希望,这篇文章能帮到你。

下一篇文章 >> MongoDB 索引第 5 部分

慕源网 » MongoDB 中存储数据的高级查询搜索(mongodb高级查询) – 第 4 部分

常见问题FAQ

程序仅供学习研究,请勿用于非法用途,不得违反国家法律,否则后果自负,一切法律责任与本站无关。
请仔细阅读以上条款再购买,拍下即代表同意条款并遵守约定,谢谢大家支持理解!

发表评论

开通VIP 享更多特权,建议使用QQ登录