mongodb按条件查询数据
如何优化mongodb的查询,存的是很复杂的json格式数据?
如何优化mongodb的查询,存的是很复杂的json格式数据?
索引支持是MongoDB高效查询的关键。如果没有索引,MongoDB必须执行集合扫描(扫描集合中所有的文档),然后筛选匹配文档。MongoDB中的索引与其他数据库系统中的索引类似。MongoDB在集合级别定义索引,并支持MongoDB集合中文档的任何字段或子字段定义索引。MongoDB 索引通过B-tree实现,查询复杂度介于O(1)到 log n之间。MongoDB提供了许多不同的索引类型来支持特定类型的数据和查询。
单字段索引:除MongoDB定义的_id索引外,MongoDB还支持在文档的单个字段上创建用户定义的升序/降序索引。复合索引:MongoDB支持用户在多个字段上定义索引,即复合索引。复合索引中字段的顺序很重要。如果复合索引为{ A: 1, B: -1 },则索引首先以A字段进行排序,然后在每个A值以B字段进行排序。多健索引:MongoDB使用多键索引来索引存储在数组中的内容。如果索引字段包含数组值,MongoDB会为数组的每个元素创建单独的索引条目。这些多键索引允许查询通过匹配数组中的元素来获取包含数组的文档。
以下是MongoDB查询优化的一些基本原则:
在查询条件、排序条件、统计条件的字段上选择创建索引,可以显著提高查询效率。必要时使用hint()强制使用某个索引查询。只查询要使用的字段,而不查询所有字段。减少使用低效的操作符,如$where和$exists操作符,完全不能使用索引 $ne和$not操作符使用索引效率较低,甚至有时完全不用索引 $nin操作符总是会全表扫描.MongoDB在一次查询中只能使用一个索引, 所以使用$or查询多次在合并结果,不如单次查询的效率高。考虑到数据分片,尽量减少跨分片查询,比如尽量少用$in,$in会让你的查询去每一个分片上查一次,可以考虑在在每个分片上建索引。
另外最最重要的是,MongoDB提供explain语句,可以获取query语句的查询计划(queryPlanner)、以及执行过程中的统计信息(executionStats)。MongoDB在解析完查询之后,通常会产生几个候选的查询计划,然后会为这些查询计划按照某个规则来打分,分数最高的查询计划就是合适的查询计划,这个查询计划里面使用的索引就是系统认为合适的索引。所以,如果你的查询太慢,可以查看查询计划,看是否使用了你想要的索引,以及扫描的具体情况,其中统计信息里面有3个返回项,nReturned、totalKeysExamined、totalDocsExamined,分别代表该条查询返回的条目、索引扫描条目、文档扫描条目。对于一个理想查询,这三个值应该尽可能接近。
最后,祝每个人的query查询都快到起飞!
java好学吗?该怎么学?
笔者作为一个在一线互联网公司从事多年Java服务端的开发人员,也是从零基础一路学习过来的,根据自己的认知对您提的问题进行简单解答:
Java到底好不好学答案是:不难学。很多人都以为编程是个很高深的东西,其实不然,真正学习了你会发现编程比你高中学的数理化要简单的多。说它不难呢,如果学深入了,还算有很多东西要学习,比如你学Java,后面可能要了解计算机组成原理、操作系统等底层知识,当然这些知识只要用心去了解,还是我们一般人都可以理解的。
Java学习途径说到一门知识或技能好不好用,学习途径是很重要的,如果没有学习途径,有的时候一个很简单的知识都要花很久搞明白。我们是踩在巨人的肩上的,老一辈人给我留下了很多宝贵知识以及经验,所以我们的学习途径非常多。
Java相关书籍:最传统的学习途径,优点就是知识点很全面,缺点就是有些知识点不单靠看书不好理解。推荐书籍:Java编程思想。Java相关视频教程:大部分程序员自学的途径,优点就是有老师带着学习,容易理解一些难理解的知识,但是大部分教程内容不全面,全面的需要付费。推荐视频:java入门高淇Java300集视频。Java官方文档:这一般是技术大佬选择的学习途径,优点就是很权威,缺点是英文文档居多,相对来说枯燥。很少人想读书一样去读,大部分作为像字典一样去查阅。Java相关技术文章:很多开发人员都有写技术博客的习惯,一是做学习或经验总结,二也是最重要的,就是展示个人实力(哈哈)。这种学习方式就需要自己去辨别技术文章的质量了,有的文章的确很棒,但是有的文章会误导人。推荐技术博客网站:CSDN、博客园。其实还有很多学习途径,就不一一列举了。这么多的学习途径,就算再难的知识也会变得并不是很困难,再说Java本来就算一门中等难度的高级编程语言,就更提不上有多难了。
最后说这么多,都是在解释Java并没有这么难。如果您还是不相信,可以思考下为什么会诞生出这么多Java培训机构,而且培训的人好多都是高中、大专的同学,而且他们也会有比较不错的工作。很明显,学习Java的难度不大,起点也不高,只要你肯学,一定比高中学的数理化简单。
笔者是一位热爱互联网、热爱互联网技术、热于分享的年轻人,如果您跟我一样,我愿意成为您的朋友,分享每一个有价值的知识给您。喜欢作者的同学,点赞 转发 关注哦!