怎么进行MONGODB 查询

技术怎么进行MONGODB 查询这篇文章给大家介绍怎么进行MONGODB 查询,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。惯了SQL 语句的开发人员,在使用MONGODB 的时候,很可能会误会这个

本文介绍了如何查询MONGODB。内容非常详细。感兴趣的朋友可以参考一下,希望对大家有所帮助。

习惯于SQL语句的开发人员在使用MONGODB时可能会误解这个数据库。纠正三点。

1虽然MONGODB存储JOSN字符串,但它不能像您想要的那样存储。虽然在用于处理数据的SCHEMA方面,它比传统数据库开放得多,但如果您真的开始开发,MongoDB数据库的属性也将让您回到原来的形式。

虽然MONGODB的查询语句不如传统的SQL语句好,但是可以做很多判断和转换(刚更新的时候,MONGODB语句在查询语句中可以有IF THEN,这是逆天的)。但是由于数据库的性质,编写MongoDB的查询语句需要一定的技巧,否则可以等到查询中天都黑了,这并不是怪MongoDB,而是怪你没有理解她的原则和秉性。

MONGO DB的使用也是标准化的,并不是说程序员可以为所欲为。世界上的一切都有自己的规则和属性,所以MongoDB的使用自然是标准化的。

让我们从以上三个方面来熟悉一下不知道怎么用的MONGODB家长。

第一,MONGODB没有数据库模式。我可以随心所欲地保存每个收藏的文档。我可以在上一张单据中保存我的一笔贷款的记录,也可以在下一张单据中保存还款的默认记录。

如果你问我,你能做到吗?从MONGODB的原理来说,你可以,当然可以,但是我想问,你忘了MONGODB的数据库属性了吗?她不是记事本,而是供你插入的数据,可能比传统数据库多几十倍。最终,你必须从数千万和数十亿条数据中过滤出几十条你想要的数据。你认为什么在你之上,每个DOCUMENT?

MONGODB的集合具有表的含义。虽然一个MONGODB的集合可以让你的SCHEMA没有规则,但是你心里应该有一个分数。这个系列应该有什么?他们由documentS组成的集合在我未来的数据处理中将扮演什么角色?

在这里,我们将讨论为什么会有像MONGODB这样的数据库,还将讨论大量的数据和微服务,以及敏捷开发。想象一下,如果你有一个项目,你不知道它有多少字段,明年会增加和删除多少字段,你也不知道这些字段的名字。此外,您将在当前状态下开始调试项目,并很快上线。感觉如何?你想一下子脱口而出f开头的英语单词吗?

STOP,MONGO DB可以帮助你快速响应和处理这样的项目,但这并不意味着MONGODB是一个垃圾场,是这类项目的捎带。正是这个无厘头的项目和不确定的表设计让MONGODB脱颖而出。(什么,没有这样的项目,你确定?)

另外,如果你有这样一套MONGODB来帮助你沟通,集中,让微服务中多个组件的信息透明化,那就是另外一种使用方式,因为在微服务中,信息的传递和信息的丢失已经让你感到不舒服了,MONGODB就是你的管家。保存所有这些信息后,您可以方便地用MONGODB的句子进行查询。而不是在文件日志中搜索,而且速度相当快,速度为us纳秒,数据量以十亿计。当然,这一切都集中在你能理解她的结构和用法这一事实上。甚至可以使用MONGODB作为BI的基础数据库,以套件的形式输出混乱复杂的信息。(MONGO支持BI自带套件)

如果说英语是世界通用的说法,那么JOSN就是计算机程序中信息传递的通用说法。各种消息都可以通过通用的JOSN格式把你的数据从一个微服务世界传递到另一个世界,不管是WINDOWS系统还是LINUX系统,JAVA还是。NET CORE或PYTHON、GO等。因为只要遇到以JOSN格式存储的数据,计算机行业就可以用任何方式处理它。

而且MONGO DB有强大的处理JOSN格式数据的能力,所以你可以用各种MONGO DB语法把JOSN层的嵌套和数组撕掉,把你想要的呈现在眼前。

停,那太远了。

下面我们来说说如何利用MONGO DB的语句来查询自己想要的信息,并通过索引来实现。所以我们就讲两个问题,1查询方法,2建索引技巧(MONGODB的查询也是广泛而深刻的,索引比较丰富多彩,能力有限,大家可以尽量多讲)。

1查询数据时,请注意没有事务,即MONGODB中没有多表关联这种东西,你的注意力只需要定位在你要查询的一个表上。

注意:MONGODB更新很快。网上找到的一些句子已经过时或者不能再用了。对应的句子请查看你对应的版本。以下陈述已被MONGODB 3.6作为标准。

举一个简单的例子,下面我们有下面27亿的数据在另一个集合下面(数据量比较小,以后再说吧)。

我们希望通过两个属性找到匹配的数据:filesource和filetype。

,那我们有以下的一条查询语句可以做这件事。

怎么进行MONGODB 查询

db.dbmongolog2.find({"filesource":0,"filetype":"1"}) 

通过上面这条语句,数据很快就查出来了,(画外音:这么简单),当然不是,难度的一点点的来,饭的一口口的吃。

怎么进行MONGODB 查询

那么问题来了,我们查询MONGO DB 中的数据,如果仅仅只需要显示部分数据,而不需要全部将所有的数据显示,是否可以节省查询的时间。

YES 是的,和传统数据库的查询一样,你要展示那些数据就标识出,你要看那些,你不看的,一定不要让他SHOW出来。

这就是 MONGODB 查询规则 1 

用那个字段,就显示那个字段,不用的别展示。 具体语句怎么写

db.dbmongolog2.find({"filesource":0,"filetype":"1"},{"_id":0,"filename":0,"createdate":0,"filetype":0,"filesource":0})

怎么进行MONGODB 查询

db.dbmongolog2.find({"filesource":0,"filetype":"1"})

怎么进行MONGODB 查询

那这样写的语句,在执行效率上有什么差别,这里做了比较,效率提高10%,由原来的0.020 秒,变为0.018秒,当然如果数据量再大,过滤的字段的大小在大,则速度会更快,这点可以说和传统数据库没有差别。

所以开发的DEVELOPER们,使用MONGODB ,一样不要把你不要的字段SHOW   出来,要禁止他。语法就是在后面加 {} 然后将字段名字后面 冒号加0 。

当然开发说,你这个不科学,MONGODB 每个DOCUEMNT (行),都不一样的情况下,我这样怎么干。

好干:那就只显示你要的字段不就完了

怎么进行MONGODB 查询

db.dbmongolog2.find({"filesource":0,"filetype":"1"},{"_id":1})

怎么进行MONGODB 查询

你只需要,将标识0的地方,标识为 1 即可,另外从截图也看出了,执行的时间,已经到了 0.08秒,快了 百分之60%。 所以这个规矩,你们是要知道的。

那我们继续,加大难度,现在我们认为,查询的时间还是过长,你(我一直宣称MONGODB 的查询速度可以达到 纳秒),那我们就来看看,MONGODB 查询继续加速。

索引,MONGODB 和传统数据库一样,是有索引的,而且索引的种类更多。

针对上面的查询,我们怎么来搞一下。

1 其实我们还是要知

db.dbmongolog2.find({"filesource":0,"filetype":"1"},{"_id":0,"filename":0,"createdate":0,"filetype":0,"filesource":0})

这个语句其实是在走全表扫描,这样是不OK 的,我们需要建立索引

怎么进行MONGODB 查询

(当然在建立索引前我们是应该,进行分析,索引建立的是否能更有效,索引建立的值得不值得,今天时间比较紧,暂不讨论,当然我们一般还是要建立采样率的分析),其实这个采样率来看,添加索引并不理想。但这里我们仅仅是演示,来建立一个索引。

怎么进行MONGODB 查询

db.dbmongolog2.createIndex({filesource:1,filetype:1},{name:"idx_dbmongolog2_filesource_filetype",background:true})

怎么进行MONGODB 查询

可以通过执行计划来验证,当前的查询已经可以走刚刚建立的索引了

怎么进行MONGODB 查询

但是别高兴的太早,如果把查询语句改写为

db.dbmongolog2.find({"filesource":0,"filetype":"1"},{"_id":0,"filename":0,"createdate":0,"filetype":0,"filesource":0}).sort({_id:1})

怎么进行MONGODB 查询

马上在看执行计划,已经不再走刚建好的索引了,走了OBJECT_ID 主键,当然执行的效率比全表扫描的效率还差。 这里我们到底做了什么,让MONGODB 不再走我们刚刚建立好的索引,答案就是 sort({_id:1})

所以一般查询语句,如果不需要排序,就不要使用排序,否则很可能你刚刚辛苦建立好的索引,就不在生效了。但如果必须要进行排序怎么办。

在重新建立了索引后,我们的查询速度又和飞一样了,看下图

怎么进行MONGODB 查询

db.dbmongolog2.createIndex({filesource:1,filetype:1,_id:-1},{name:"idx_dbmongolog2_filesource_filetype_id",background:true})

上面的建立索引的语句,请注意每个字段的后面的数字, 1是升序,-1是降序,尤其排序,如果经常降序,则就别把索引建立成升序。

讲完简单的查询和索引的建立,其实一个MONGODB 数据库的系统能顺畅建立,主要还要考虑你的collection,当然如果你仅仅将MONGODB 作为日志的系统,你可以考虑的更少。

但实际上,MONGODB 的collection 的确是可以做很多事,例如他可以轻松将传统数据库上的几个负载的 JOIN 操作,在一个collection就完成了,通过嵌套,将这些JOIN 就体现在一个 collection上,所以查询的速度会很快,是传统数据库望尘莫及的。缺点吗, 可能会损失空间,是一种用空间,换时间的方式。(MONGODB 的数据会自动压缩,进入就压缩,所以非要找点缺点,也的说点)。

下面在对表的查询和索引,在进一步,既然是晋级,

1  索引的建立技巧,我们继续看下面的查询语句,我们查询一个时间在2018年12月18日后的记录,并且filetype字段,是

db.dbmongolog2.find({"createdate":{$gte:ISODate("2018-12-18T17:39:43.207+08:00")},"filetype":1}

很明显查询已经走了全表扫描,不是建立了索引,为什么不可以了,我们换一种写法

怎么进行MONGODB 查询

db.dbmongolog2.find({"filetype":1,"createdate":{$gte:ISODate("2018-12-18T17:39:43.207+08:00")}},{"_id":1}).explain()

换一种写法,查看执行计划,还是不可以,还是全表扫描

这里总结一个MONGODB 的建立索引的规律

索引建立有技巧,可以先算采样率,分布离散字段放前边,符合字段索引,必查字段放前边,一个查询可以多个字段,多个索引,可以使用索引的交集(MYSQL中的INDEX MERGE的概念有点像),如何使用还要看优化引擎的选择。但如果一个复合索引能解决的,最好不要使用

Index Intersection。

所以一个MONGODB 看上去就是一个文档数据库,整体执行文件才百兆,但里面的东西,不比 ORACLE  SQL SERVER 的知识少,也够喝一壶。

另外小小的MONGODB ,也可以做聚合,类似传统数据库的 GROUP BY  HAVING  SUM ,AVAGE 等运算,所以这个MONGODB 绝非善类,4.0开始支持事务,所以NO-SQL 数据库,哪天发力也不光抢光非关系的市场,连你关系型的市场,也要分一杯羹。

MONGODB的聚合操作

db.dbmongolog2.aggregate([{"$match":{"createdate":{$gte:ISODate("2018-12-18T17:39:43.207+08:00")}}},{$group:{_id:{filetype:"$filetype",filesource:"$filesource"},"count":{"$sum":1}}}]).explain()

怎么进行MONGODB 查询

关于怎么进行MONGODB 查询就分享到这里了,希望

内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/66427.html

(0)

相关推荐