mongoDB查询及游标

本文涉及的产品
云数据库 MongoDB,独享型 2核8GB
推荐场景:
构建全方位客户视图
简介: find文档 1.find简介 使用find查询集合中符合条件的子集合 1 db.test.blog.find(); 类似于sql查询 1 select * from test.blog   上面的查询是返回多有多有集合,并且是所有键。

find文档

1.find简介

使用find查询集合中符合条件的子集合

1 db.test.blog.find();  

类似于sql查询

1 select * from test.blog 

 

上面的查询是返回多有多有集合,并且是所有键。有时我们也会指定返回部分键,这样方式可以减少IO

1 > db.test.blog.find({},{"age":1,"name":1});  
2 { "_id" : 1, "age" : 1, "name" : "joe" }  
3 { "_id" : ObjectId("533a1c27b653a97435a02030") }  
4 { "_id" : "2" }  

类似sql查询

1 select age , name from test.blog  

 

使用带条件的查询举例:

1 > db.test.blog.find({"age":1});  
2 { "_id" : 1, "age" : 1, "like" : [ "eat", "abc" ], "name" : "joe" }  

类似sql查询

1 select * from test.blog where age = 1  

2.查询条件

比较操作符:

命令 描述
$lt <
$lte <=
$gt >
$gte >=

 

1 > db.student.find({age:{$lte:12,$gte:10}}); 

类似sql

1 select * from student where age >= 10 and age <= 12 

 

$ne:不等,能用于多有类型的数据

1 > db.student.find({age:{$ne:10}});  

类似sql

1 select * from student where age != 10

3.OR查询

命令 描述
$in 查询一个键的多个值
$or 用来完成多个键值的任意给定值

$in用法代码

1 > db.student.find({age:{$in:[10,13]}});  
2 { "_id" : 0, "name" : "aa0", "age" : 10 }  
3 { "_id" : 3, "name" : "aa3", "age" : 13 }  
4 { "_id" : 5, "name" : "aa5", "age" : 10 }  
5 { "_id" : 8, "name" : "aa8", "age" : 13 }  

 类比sql

1 select * from student where age in (10,13);

 

$or代码

1 > db.student.find({"$or":[{"age":{$in:[10,13]}},{"name":"aa7"}]});  
2 { "_id" : 0, "name" : "aa0", "age" : 10 }  
3 { "_id" : 3, "name" : "aa3", "age" : 13 }  
4 { "_id" : 5, "name" : "aa5", "age" : 10 }  
5 { "_id" : 7, "name" : "aa7", "age" : 12 }  
6 { "_id" : 8, "name" : "aa8", "age" : 13 }  

类比sql

1 select * from student where age in (10,13) or name = 'aa0'  

4.$not

$not是原条件句,可以用在任何其他条件之上

1 > db.student.find({"age":{$not:{"$mod":[5,1]}}});  
2 { "_id" : 0, "name" : "aa0", "age" : 10 }  
3 { "_id" : 2, "name" : "aa2", "age" : 12 }  
4 { "_id" : 3, "name" : "aa3", "age" : 13 }  
5 { "_id" : 4, "name" : "aa4", "age" : 14 }  
6 { "_id" : 5, "name" : "aa5", "age" : 10 }  
7 { "_id" : 7, "name" : "aa7", "age" : 12 }  
8 { "_id" : 8, "name" : "aa8", "age" : 13 }  
9 { "_id" : 9, "name" : "aa9", "age" : 14 }  

$mod:将查询的值除以第一个参数“5”,如果余数等于第二个参数“1”那么返回该值

5.null

null可以匹配自身(key对应的值为null),还可以匹配“不存在的”(文档中不存在这个key)。

 1 > db.student.find({"like":null});  
 2 { "_id" : 1, "name" : "aa1", "age" : 11 }  
 3 { "_id" : 2, "name" : "aa2", "age" : 12 }  
 4 { "_id" : 3, "name" : "aa3", "age" : 13 }  
 5 { "_id" : 4, "name" : "aa4", "age" : 14 }  
 6 { "_id" : 5, "name" : "aa5", "age" : 10 }  
 7 { "_id" : 6, "name" : "aa6", "age" : 11 }  
 8 { "_id" : 7, "name" : "aa7", "age" : 12 }  
 9 { "_id" : 8, "name" : "aa8", "age" : 13 }  
10 { "_id" : 9, "name" : "aa9", "age" : 14 }  
11 { "_id" : 0, "age" : 10, "like" : null, "name" : "aa0" }  
12   
13 > db.student.find({"like":null,"like":{$exists:true}});  
14 { "_id" : 0, "age" : 10, "like" : null, "name" : "aa0" } 

说明:$exists:判断键是否存在

6.正则表达式

 1 > db.student.find({"name":/aa/});  
 2 { "_id" : 1, "name" : "aa1", "age" : 11 }  
 3 { "_id" : 2, "name" : "aa2", "age" : 12 }  
 4 { "_id" : 3, "name" : "aa3", "age" : 13 }  
 5 { "_id" : 4, "name" : "aa4", "age" : 14 }  
 6 { "_id" : 5, "name" : "aa5", "age" : 10 }  
 7 { "_id" : 6, "name" : "aa6", "age" : 11 }  
 8 { "_id" : 7, "name" : "aa7", "age" : 12 }  
 9 { "_id" : 8, "name" : "aa8", "age" : 13 }  
10 { "_id" : 9, "name" : "aa9", "age" : 14 }  
11 { "_id" : 0, "age" : 10, "like" : null, "name" : "aa0" }  
12 > db.student.find({"name":/aa1/});  
13 { "_id" : 1, "name" : "aa1", "age" : 11 } 

使用/reg/来表示正则

7.查询数组

命令 描述
$all 匹配数组中的多个元素
$size 匹配数组的长度
$slice 返回数组中的子集合

$all代码

1 > db.food.find({"fruit":{$all:["apple","banana"]}});  
2 { "_id" : 1, "fruit" : [ "apple", "banana", "peach" ] }  
3 { "_id" : 3, "fruit" : [ "cherry", "banana", "apple" ] }  
4   
5 > db.food.find({"fruit":"apple"});  
6 { "_id" : 1, "fruit" : [ "apple", "banana", "peach" ] }  
7 { "_id" : 2, "fruit" : [ "apple", "kumquat", "orange" ] }  
8 { "_id" : 3, "fruit" : [ "cherry", "banana", "apple" ] }  

$size代码

1 > db.food.find({"fruit":{$size:3}});  
2 { "_id" : 1, "fruit" : [ "apple", "banana", "peach" ] }  
3 { "_id" : 2, "fruit" : [ "apple", "kumquat", "orange" ] }  
4 { "_id" : 3, "fruit" : [ "cherry", "banana", "apple" ] }

8.查询内嵌文档

用“.”表示法是查询文档区别于其他文档的主要特点。查询文档可以包含点,来表示深入内嵌文档内部。点表示法也是待插入的文档不能包含"."的原因。

1 > db.food.insert({"_id":4,"fruit":{"apple":"good","banana":"good"}});  
2 > db.food.insert({"_id":5,"fruit":{"apple":"best","banana":"good"}});  
3 > db.food.find({"fruit.apple":"good"});  
4 { "_id" : 4, "fruit" : { "apple" : "good", "banana" : "good" } }  
5 > db.food.find({"fruit.apple":"best"});  
6 { "_id" : 5, "fruit" : { "apple" : "best", "banana" : "good" } } 

9.$where

如果前面的查询方法都不能实现,那么就轮到$where子句了,用它可以执行任意javascript作为查询的一部分,where可以接受一个javascript函数作为查询条件,并且迭代当前集合里面的所有文档,如果满足函数条件,则返回这个文档。最典型的就是比较文档中的两个键的值是否相等。

1 //现在有下面这个集合,要找出库存和销量相同的记录  
2 > db.foo.insert({"name":"apple","ku_cun":100,"xiao_liang":100});  
3 > db.foo.insert({"name":"banana","ku_cun":120,"xiao_liang":100});  
4   
5 //下面是用$where查询  
6 > db.foo.find({$where:function(){if(this.ku_cun == this.xiao_liang)return true;}  
7 });  
8 { "_id" : ObjectId("533bd36909fa3b030490f059"), "name" : "apple", "ku_cun" : 100  
9 , "xiao_liang" : 100 }  

this就是引用当前集合中的一个文档。

 $where除了可以接受一个function函数,还可以接受一个function的字符串

1 //这是接受一个function的字符串,效果是一样的  
2 > db.foo.find({$where:"function(){if(this.ku_cun == this.xiao_liang)return true;  
3 }"});  
4 { "_id" : ObjectId("533bd36909fa3b030490f059"), "name" : "apple", "ku_cun" : 100  
5 , "xiao_liang" : 100 }  

 如果return true;表示当前遍历的这个文档满足条件,那么就把这条记录(文档)返回出来。

还有更复杂的查询可以利用MapReduce

特别说明:使用$where效率比较低,因为mongodb要将BOSN数据转成javascript数据,然后一个一个遍历操作。并且不能使用索引。建议使用常规查询作为前置过滤,然后与$where组合使用。

2.游标

数据库使用游标来返回find的执行结果。客户端对游标的实现通常能够对最终结果进行有效的控制。可以限制结果的数量(limit),掠过部分数据(skip),对结果进行排序(sort),或者执行其他操作.

Skip_limit_sort代码

 1 //使用limit,获取查询结果的前5条记录(文档)  
 2 > db.student.find().limit(5);  
 3 { "_id" : 1, "name" : "aa1", "age" : 11 }  
 4 { "_id" : 2, "name" : "aa2", "age" : 12 }  
 5 { "_id" : 3, "name" : "aa3", "age" : 13 }  
 6 { "_id" : 4, "name" : "aa4", "age" : 14 }  
 7 { "_id" : 5, "name" : "aa5", "age" : 10 }  
 8   
 9 //使用skip和limit,跳过查询结果的前两条,取得后面的5条记录(文档)  
10 > db.student.find().skip(2).limit(5);  
11 { "_id" : 3, "name" : "aa3", "age" : 13 }  
12 { "_id" : 4, "name" : "aa4", "age" : 14 }  
13 { "_id" : 5, "name" : "aa5", "age" : 10 }  
14 { "_id" : 6, "name" : "aa6", "age" : 11 }  
15 { "_id" : 7, "name" : "aa7", "age" : 12 }  
16   
17 //使用sort,对跳过前2条之后的5条记录按照age倒序  排序  
18 > db.student.find().skip(2).limit(5).sort({"age":-1});  
19 { "_id" : 3, "name" : "aa3", "age" : 13 }  
20 { "_id" : 8, "name" : "aa8", "age" : 13 }  
21 { "_id" : 2, "name" : "aa2", "age" : 12 }  
22 { "_id" : 7, "name" : "aa7", "age" : 12 }  
23 { "_id" : 1, "name" : "aa1", "age" : 11 }  
24   
25 //使用sort,对跳过前2条之后的5条记录按照age顺序  排序  
26 > db.student.find().skip(2).limit(5).sort({"age":1});  
27 { "_id" : 1, "name" : "aa1", "age" : 11 }  
28 { "_id" : 6, "name" : "aa6", "age" : 11 }  
29 { "_id" : 2, "name" : "aa2", "age" : 12 }  
30 { "_id" : 7, "name" : "aa7", "age" : 12 }  
31 { "_id" : 3, "name" : "aa3", "age" : 13 }  

 因为mongodb相同的键可以对应不用类型,所以在排序时有可能存在不同类型的比较。mongodb有一个预先定义好的,从小到大:

 1 最小值
 2 null
 3 数字
 4 字符串
 5 对象/文档
 6 数组
 7 二进制数据
 8 对象ID
 9 布尔型 
10 日期型
11 时间戳
12 正则表达式
13 最大值

如果skip过多的文档,会导致速度比较慢,这是你的分页可能的想想其他方法了。例如可以根据时间排序,然后下一页时,根据上一页的最后一条记录的时间作为这一页查询的条件。

 

当神已无能为力,那便是魔渡众生
相关实践学习
MongoDB数据库入门
MongoDB数据库入门实验。
快速掌握 MongoDB 数据库
本课程主要讲解MongoDB数据库的基本知识,包括MongoDB数据库的安装、配置、服务的启动、数据的CRUD操作函数使用、MongoDB索引的使用(唯一索引、地理索引、过期索引、全文索引等)、MapReduce操作实现、用户管理、Java对MongoDB的操作支持(基于2.x驱动与3.x驱动的完全讲解)。 通过学习此课程,读者将具备MongoDB数据库的开发能力,并且能够使用MongoDB进行项目开发。 &nbsp; 相关的阿里云产品:云数据库 MongoDB版 云数据库MongoDB版支持ReplicaSet和Sharding两种部署架构,具备安全审计,时间点备份等多项企业能力。在互联网、物联网、游戏、金融等领域被广泛采用。 云数据库MongoDB版(ApsaraDB for MongoDB)完全兼容MongoDB协议,基于飞天分布式系统和高可靠存储引擎,提供多节点高可用架构、弹性扩容、容灾、备份回滚、性能优化等解决方案。 产品详情: https://www.aliyun.com/product/mongodb
目录
相关文章
|
24天前
|
存储 NoSQL MongoDB
掌握MongoDB索引优化策略:提升查询效率的关键
在数据库性能调优中,索引是提升查询效率的利器。本文将带你深入了解MongoDB索引的内部工作原理,探讨索引对查询性能的影响,并通过实际案例指导如何针对不同的查询模式建立有效的索引。不仅将涵盖单一字段索引,还会探讨复合索引的使用,以及如何通过分析查询模式和执行计划来优化索引,最终实现查询性能的最大化。
|
14天前
|
存储 NoSQL MongoDB
MongoDB 查询分析
10月更文挑战第21天
9 1
|
14天前
|
NoSQL MongoDB 索引
MongoDB 覆盖索引查询
10月更文挑战第21天
21 1
|
20天前
|
SQL NoSQL MongoDB
MongoDB 查询文档
10月更文挑战第15天
12 1
|
21天前
|
人工智能 NoSQL 机器人
MongoDB Atlas与YoMio.AI近乎完美适配:推理更快速、查询更灵活、场景更丰富
随着MongoDB的新发布和革新,YoMio.AI的“闪电式发展”值得期待。
|
2月前
|
SQL NoSQL JavaScript
04 MongoDB各种查询操作 以及聚合操作总结
文章全面总结了MongoDB中的查询操作及聚合操作,包括基本查询、条件筛选、排序以及聚合管道的使用方法和实例。
69 0
|
3月前
|
JSON NoSQL MongoDB
MongoDB Schema设计实战指南:优化数据结构,提升查询性能与数据一致性
【8月更文挑战第24天】MongoDB是一款领先的NoSQL数据库,其灵活的文档模型突破了传统关系型数据库的限制。它允许自定义数据结构,适应多样化的数据需求。设计MongoDB的Schema时需考虑数据访问模式、一致性需求及性能因素。设计原则强调简洁性、查询优化与合理使用索引。例如,在构建博客系统时,可以通过精心设计文章和用户的集合结构来提高查询效率并确保数据一致性。正确设计能够充分发挥MongoDB的优势,实现高效的数据管理。
56 3
|
3月前
|
存储 NoSQL MongoDB
【掌握MongoDB】轻松精通MongoDB查询,从基础到高级一网打尽!
【8月更文挑战第24天】在数据驱动的时代,数据库的性能与灵活性对企业至关重要。MongoDB作为一种高性能、无模式的文档数据库,为开发者提供了灵活的数据存储方案。尤其在处理半结构化或多变数据时展现出强大优势。本文重点介绍MongoDB中的查询操作,包括基本查询、条件查询、复杂查询以及字段选择、排序和限制等功能。通过掌握这些基本查询技巧,开发者能够有效从MongoDB中检索数据,支持复杂的业务逻辑。
59 1
|
3月前
|
C# 微服务 Windows
模块化革命:揭秘WPF与微服务架构的完美融合——从单一职责原则到事件聚合器模式,构建高度解耦与可扩展的应用程序
【8月更文挑战第31天】本文探讨了如何在Windows Presentation Foundation(WPF)应用中借鉴微服务架构思想,实现模块化设计。通过将WPF应用分解为独立的功能模块,并利用事件聚合器实现模块间解耦通信,可以有效提升开发效率和系统可维护性。文中还提供了具体示例代码,展示了如何使用事件聚合器进行模块间通信,以及如何利用依赖注入进一步提高模块解耦程度。此方法不仅有助于简化复杂度,还能使应用更加灵活易扩展。
91 0
|
3月前
|
安全 C# 数据安全/隐私保护
WPF安全加固全攻略:从数据绑定到网络通信,多维度防范让你的应用固若金汤,抵御各类攻击
【8月更文挑战第31天】安全性是WPF应用程序开发中不可或缺的一部分。本文从技术角度探讨了WPF应用面临的多种安全威胁及防护措施。通过严格验证绑定数据、限制资源加载来源、实施基于角色的权限管理和使用加密技术保障网络通信安全,可有效提升应用安全性,增强用户信任。例如,使用HTML编码防止XSS攻击、检查资源签名确保其可信度、定义安全策略限制文件访问权限,以及采用HTTPS和加密算法保护数据传输。这些措施有助于全面保障WPF应用的安全性。
51 0