我的编程空间,编程开发者的网络收藏夹
学习永远不晚

MongoDB查询与游标之分布式文件存储的方法是什么

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

MongoDB查询与游标之分布式文件存储的方法是什么

本篇内容主要讲解“MongoDB查询与游标之分布式文件存储的方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“MongoDB查询与游标之分布式文件存储的方法是什么”吧!

一、查询

1、find()基本用法

查询就是返回集合中文档的一个子集,子集的范围从0个文档到整个集合。要返回哪些文档由find的第一个参数决定,该参数是一个用于指定查询条件的文档。

如果是空,则返回全部文档。

当向查询文档中添加键值对时,就意味着限定了查询条件。例如db.users.find({"name":"哪吒编程"})

可以在查询文档时,传入多个键值对,相当于关系型数据库中的where ... and ...

2、指定要返回的键

有时候,只想查询文档中的部分键

> db.users.find({},{"id":1,"dept":1}){ "_id" : ObjectId("638b2822bb535f1c23f9b09a"), "id" : "1", "dept" : [ { "name" : "哪吒编程", "age" : 18, "address" : "大连" }, { "name" : "云韵", "age" : 19, "address" : "大连" }, { "name" : "美杜莎", "age" : 28, "address" : "北京" } ] }{ "_id" : ObjectId("638b3944bb535f1c23f9b09b"), "id" : "1", "dept" : [ { "name" : "哪吒编程", "age" : 18, "address" : "大连" }, { "name" : "云韵", "age" : 19, "address" : "大连" }, { "name" : "美杜莎", "age" : 28, "address" : "北京" } ] }> db.users.find({},{"_id":0,"dept":1}){ "dept" : [ { "name" : "哪吒编程", "age" : 18, "address" : "大连" }, { "name" : "云韵", "age" : 19, "address" : "大连" }, { "name" : "美杜莎", "age" : 28, "address" : "北京" } ] }{ "dept" : [ { "name" : "哪吒编程", "age" : 18, "address" : "大连" }, { "name" : "云韵", "age" : 19, "address" : "大连" }, { "name" : "美杜莎", "age" : 28, "address" : "北京" } ] }

3、查询条件

$lt、$lte、$gt、$gte都属于比较运算符,分别对应<、<=、>、>=

可以将其组合使用以查找一个范围内的值。

> db.users.find({"dept.age":{"$gte":20,"$lte":30}})

4、or查询

MongoDB中有两种方式可以进行or查询。$in可以用来查询一个键的多个值。$or则更通用一些,可以在多个键中查询任意的给定值。

> db.users.find({"id":{"$in":["1","3"]}}){ "_id" : ObjectId("638b2822bb535f1c23f9b09a"), "id" : "1", "dept" : [ { "name" : "哪吒编程", "age" : 18, "address" : "大连" }, { "name" : "云韵", "age" : 19, "address" : "大连" }, { "name" : "美杜莎", "age" : 28, "address" : "北京" } ] }{ "_id" : ObjectId("638b3944bb535f1c23f9b09b"), "id" : "1", "dept" : [ { "name" : "哪吒编程", "age" : 18, "address" : "大连" }, { "name" : "云韵", "age" : 19, "address" : "大连" }, { "name" : "美杜莎", "age" : 28, "address" : "北京" } ] }{ "_id" : ObjectId("638b4cacbb535f1c23f9b09c"), "id" : "3", "dept" : [ { "name" : "哪吒编程", "age" : 18, "address" : "大连" }, { "name" : "云韵", "age" : 19, "address" : "大连" }, { "name" : "美杜莎", "age" : 28, "address" : "北京" } ] }>

5、$not

$not是一个元条件运算符,可以用于任何其它条件之上。

二、特定类型的查询

1、null

null的行为有一些特别。它可以与自身匹配。

> db.users.find({"dept":null}){ "_id" : ObjectId("638b538682bdbdfa72665a11"), "id" : "1", "dept" : null }

2、正则表达式

"$regex"可以在查询中为字符串的模式匹配提供正则表达式功能。正则表达式对于灵活的字符串匹配非常有用。

> db.users.find({"name":{"$regex":"哪吒"}})){ "_id" : ObjectId("638b549982bdbdfa72665a12"), "id" : "1", "name" : "哪吒编程", "age" : 18 }{ "_id" : ObjectId("638b54cd82bdbdfa72665a15"), "id" : "1", "name" : "CSDN哪吒", "age" : 18 }

MongoDB会使用Perl兼容的正则表达式(PRCE)库来对正则表达式进行匹配。任何PCRE支持的正则表达式语法都能被MongoDB接受。

3、查询数组

$all可以通过多个元素匹配数组。

> db.workers.find({name:{$all:["哪吒编程","云韵"]}}){ "_id" : ObjectId("638b2154bb535f1c23f9b098"), "id" : "1", "name" : [ "哪吒编程", "云韵" ] }{ "_id" : ObjectId("638b59fc82bdbdfa72665a16"), "id" : "1", "name" : [ "哪吒编程", "云韵", "美杜莎" ] }{ "_id" : ObjectId("638b59fc82bdbdfa72665a17"), "id" : "2", "name" : [ "哪吒编程", "云韵", "纳兰嫣然" ] }

如果想在数组中查询特定位置的元素,可以使用key.index语法来指定下标:

> db.workers.find({"name.2":"美杜莎"}){ "_id" : ObjectId("638b59fc82bdbdfa72665a16"), "id" : "1", "name" : [ "哪吒编程", "云韵", "美杜莎" ] }

通过$size指定要查找的数组的大小:

> db.workers.find({"name":{"$size":2}}){ "_id" : ObjectId("638b2154bb535f1c23f9b098"), "id" : "1", "name" : [ "哪吒编程", "云韵" ] }

4、数组与范围查找的相互作用

先举一个例子:

> db.student.find(){ "_id" : ObjectId("638b6b8382bdbdfa72665a19"), "id" : "1", "name" : "哪吒编程", "age" : 18 }{ "_id" : ObjectId("638b6b8482bdbdfa72665a1a"), "id" : "2", "name" : "云韵", "age" : 23 }{ "_id" : ObjectId("638b6b8482bdbdfa72665a1b"), "id" : "3", "name" : "美杜莎", "age" : [ 15, 29 ] }{ "_id" : ObjectId("638b6b8582bdbdfa72665a1c"), "id" : "3", "name" : "萧炎", "age" : 38 }> db.student.find({"age":{"$gt":20,"$lt":28}}){ "_id" : ObjectId("638b6b8482bdbdfa72665a1a"), "id" : "2", "name" : "云韵", "age" : 23 }{ "_id" : ObjectId("638b6b8482bdbdfa72665a1b"), "id" : "3", "name" : "美杜莎", "age" : [ 15, 29 ] }

和想象中的不太一样啊,我的本意是查询年龄在20~28之间的人,为什么呢?

文档中的标量(非数组元素)必须与查询条件中的每一条子句相匹配。如果使用db.student.find({"age":{"$gt":20,"$lt":28}})进行查询,那么age必须介于20~28之间,然而,如果age是一个数组,那么当age键中的某一个元素与查询条件的任意一条语句相匹配时,文档也会被返回。(即15<28,29大于20),完美适配。

这样就会使针对数组的范围查询失去了作用。

此时,可以使用"$elemMatch"强制MongoDB将这两个子句与单个数组元素进行比较。不过,"$elemMatch"不会匹配非数组元素。

-- 返回空db.student.find({"age":{"$elemMatch":{"$gt":20,"$lt":28}}})

如果在查询的字段上有索引,那么可以使用min和max将查询条件遍历的索引范围限制为"$gt""$lt"的值。

db.student.find({"age":{"$gt":20,"$lt":28}}).min({"age":20}).max({"age":28})

现在,这条查询语句只会遍历值在20~28之间的索引。

三、游标

数据库会使用游标返回find的执行结果。游标的客户端实现通常能够在很大程度上对查询的最终输出进行控制。你可以限制结果的数量,跳过一些结果,按任意方向的任意键组合对结果进行排序,以及执行徐国其他功能强大的操作。

通过cursor.hasNext()检查是否还有其它结果,通过cursor.next()用来对其进行获取。

调用find()时,shell并不会立即查询数据库,而是等到真正开始请求结果时才发送查询,这样可以在执行之前给查询附加额外的选项。cursor对象的大多数方法会返回游标本身,这样就可以按照任意顺序将选项链接起来了。

在使用db.users.find();查询时,实际上查询并没有真正执行,只是在构造查询,执行cursor.hasNext(),查询才会发往服务器端。shell会立刻获取前100个结果或者前4MB的数据(两者之中的较小者),这样下次调用next或者hasNext时就不必再次连接服务器去获取结果了。在客户端遍历完第一组结果后,shell会再次连接数据库,使用getMore请求更多的结果。getMore请求包含一个游标的标识符,它会向数据库询问是否还有更多的结果,如果有则返回下一批结果。这个过程会一直持续,直到游标耗尽或者结果被全部返回。

四、游标的生命周期

在服务器端,游标会占用内存和资源。一旦游标遍历完结果之后,或者客户端发送一条消息要求终止,数据库就可以释放它正在使用的资源。

何时销毁游标:

  1. 当游标遍历完匹配的结果时,它会消除自身;

  2. 当游标超出客户端的作用域时,驱动程序会向数据库发送一条特殊的消息,让数据库终止该游标;

  3. 如果10分钟没有被使用的话,数据库游标也将自动销毁;

五、limit、skip、soat

1、常用的查询选项

最常用的查询选项是限制返回结果的数量、略过一定数量的结果以及排序。所有这些选项必须在查询被发送到数据库之前指定。

  • limit:限制数量;

  • skip:略过;

  • soat:排序,1是升序,-1是降序;

使用skip略过少量的文档是可以的,但对于结果非常多的情况,skip会非常慢,因为要首先找到被略过的结果,然后再丢弃这些数据。

2、使用skip进行分页

最简单的分页方式是

> db.student.find().sort({"id":1}).limit(5){ "_id" : ObjectId("638b6b8382bdbdfa72665a19"), "id" : "1", "name" : "哪吒编程", "age" : 18 }{ "_id" : ObjectId("638c6685e96330d24f819176"), "id" : "1", "name" : "哪吒编程", "age" : 18 }{ "_id" : ObjectId("638c6685e96330d24f81917f"), "id" : "10", "name" : "云韵", "age" : 23 }{ "_id" : ObjectId("638c6685e96330d24f819180"), "id" : "11", "name" : "美杜莎", "age" : 29 }{ "_id" : ObjectId("638c6686e96330d24f819181"), "id" : "12", "name" : "萧炎", "age" : 38 }> db.student.find().sort({"id":1}).skip(5).limit(5){ "_id" : ObjectId("638b6b8482bdbdfa72665a1a"), "id" : "2", "name" : "云韵", "age" : 23 }{ "_id" : ObjectId("638c6685e96330d24f819177"), "id" : "2", "name" : "云韵", "age" : 23 }{ "_id" : ObjectId("638b6b8582bdbdfa72665a1c"), "id" : "3", "name" : "萧炎", "age" : 38 }{ "_id" : ObjectId("638b6b8482bdbdfa72665a1b"), "id" : "3", "name" : "美杜莎", "age" : [ 15, 29 ] }{ "_id" : ObjectId("638c6685e96330d24f819178"), "id" : "3", "name" : "美杜莎", "age" : 29 }> db.student.find().sort({"id":1}).skip(10).limit(5){ "_id" : ObjectId("638c6685e96330d24f819179"), "id" : "4", "name" : "萧炎", "age" : 38 }{ "_id" : ObjectId("638c6685e96330d24f81917a"), "id" : "5", "name" : "哪吒编程", "age" : 18 }{ "_id" : ObjectId("638c6685e96330d24f81917b"), "id" : "6", "name" : "云韵", "age" : 23 }{ "_id" : ObjectId("638c6685e96330d24f81917c"), "id" : "7", "name" : "美杜莎", "age" : 29 }{ "_id" : ObjectId("638c6685e96330d24f81917d"), "id" : "8", "name" : "萧炎", "age" : 38 }>

3、不用skip进行分页

可以通过以下方式:

MongoDB查询与游标之分布式文件存储的方法是什么

到此,相信大家对“MongoDB查询与游标之分布式文件存储的方法是什么”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

MongoDB查询与游标之分布式文件存储的方法是什么

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

MongoDB查询与游标之分布式文件存储的方法是什么

本篇内容主要讲解“MongoDB查询与游标之分布式文件存储的方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“MongoDB查询与游标之分布式文件存储的方法是什么”吧!一、查询1、find
2023-07-05

MongoDB查询与游标之分布式文件存储

目录一、查询1、find()基本用法2、指定要返回的键3、查询条件4、or查询5、$not二、特定类型的查询1、null2、正则表达式3、查询数组4、数组与范围查找的相互作用三、游标四、游标的生命周期五、limit、skip、soat1、常
2023-04-03

MongoDB通过查询与游标彻底玩转分布式文件存储

目录MongoDB简介1.MongoDB主要特点1.1文档数据库1.2高性能1.3高可用性1.4 水平可扩展1.5支持多个存储引擎2.应用场景MongoDB通过查询与游标彻底玩转分布式文件存储一、查询1、find()基本用法2、指定要返回的
2023-01-06

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录