`

2.MongoDB 查询

阅读更多

1.find

(1)查询条件(也叫查询文档) 第一个参数键值对进行匹配查询 默认是{} 返回全部

db.test.find()

(2)指定返回的键第二个参数 非零整数、true、字符串代表包含, 0和false代表不包含,可以配合使用

db.foo.find({},{"bar":1,"_id":false})

(3)查询文档值必须是常量

 

2.查询条件

(1)查询范围 $lt < , $lte <= , $gt > , $gte >= 

除普通数字范围外,也适用于于查询日期范围 

var start = new Date("2015-01-01");  var end = new Date("2015-01-31 23:59:59")

db.users.find({"createdate":{"$gt":start,"$lt":end},"age":{"$gte":28}});

 

(2)IN/OR查询

$in 查询一个键的多个值 

db.users.find({"age":{"$in":[27,28,39]}});

$or  用来完成多个键值的任意给定值(查询文档是数组)

db.users.find({"$or":[{"createdate":{"$gt":start,"$lt":end}},{"age":{"$in":[27,29]}}]}) // 匹配 create在时间范围内,或age在范围内

 

(3)$not 可以用在任何其他条件组合

db.users.find({"age":{"$not":{"$in":[27,29]}}}); // 匹配键age的值不在27、29范围内的文档

 

(4)$exists 判断文档中是否存在某键

db.users.find({"bar":{"$exists":true}}) // 匹配存在键bar的文档

 

(5)$mod 取模运算符

查询的值除以第一个给定的值,判断余数是否等于第二个给定的值

db.users.find({"age":{"$mod":[5,3]}}); // 匹配键age除以5与3的文档

 

3.特定类型的查询

(1)null

null除匹配某键的值为null外,还可以匹配文档中“不存在”某键,如果仅仅想要匹配键值为null的文档,还需要用到$exists条件判定键值

db.users.find({"bar":{"$exists":true,"$in":[null]}}) // bar字段存在,且值为null

 

(2)正则表达式   /正则表达式/i 可以不写i

db.users.find({"name":/T?/i}) // name键的值匹配正则 T?

db.users.find({"age":28,"name":/.*/})

 

(3)查询数组

如果查询元素是数组

$all 同时包含多个元素

db.users.find({foo:{$all:[1,3,5]}}) // foo中包含值 1,3,5

如果只需要包含一个元素可以直接写出 db.users.find({foo:5}) // foo集合中包含值 5

$size 查询指定长度的数组

db.users.find({foo:{$size:4}});

$size不能与其他查询子句组合,如果需要查询指定长度范围,可以添加一个size键,每次向数组添加元素的时候,可以 $inc size的值

$slice 返回数组的一个子集合

 db.users.find({},{foo:{$slice:3}}); // 其他属性正常 集合foo只输出前3项,负数代表后几项

 

(4)查询内嵌文档

使用 . 点表示法查询内嵌的键

db.user.find({"name.first":"Joe","name.last":"Schmoe"})

复杂内嵌文档使用 $elemMatch

db.user.find({"comments":{"$elemMatch":{"author":"Joe","score":{"$gte":5}}}})

 

4.$where查询

$where可以执行任意JavaScript作为查询的一部分 函数返回true或false 避免使用$where查询 太慢

db.foo.find({“$where”:"this.x+this.y==10"}) 等价于 db.foo.find({“$where”:"function(){this.x+this.y==10;}"}) 

 

5.游标

数据库使用游标来返回find的执行结果 var cursor = db.users.find()

while(cursor.hasNext()){

    cursor.next()

}

 

(1)limit、skip和sort 

db.c.find().limit(3) // 只返回3个结果

db.c.find().skip(3) // 略过前3个结果 返回剩余的结果

db.c.find().sort({username:1,age:-1})  // 正数 根据username升序,负数 根据age降序

 

第一次查询25条 db.c.find({"foo":"bar"}).limit(25).sort({"createdate":-1})

第二次跳过25条 db.c.find({"foo":"bar"}).limit(25).skip(25).sort({"createdate":-1})

 

(2)避免使用skip略过大量结果

查询记录总数 db.keyword.find().length() ==db.keyword.find().count()

查询不重复数据的记录总数 db.keyword.distinct("keyword").length 查看keyword表中keyword字段没有重复的记录总数

 

最简单的分页就是用limit返回结果的第一页,然后将每个后续页作为相对于开始的偏移量返回

var page1 = db.foo.find(criteria).limit(100);

var page2 = db.foo.find(criteria).skip(200).limit(100);

var page3 = db.foo.find(criteria).skip(300).limit(100);

 

第二种方法可以同排序之后的结果来实现

var page1 = db.foo.find().sort({"date":-1}).limit(100);

// 然后通过最后一个文档的date继续查询

var lastest = null;

while(page1.hasNext()){

    laster = page1.next();

}

var page2 = db.foo.find({"date":{"$gt":lastest.date}}).sort({"date":-1}).limit(100);

 

 

(3)高级查询选项

查询分为包装的和普通的两类

shell会把比如包装的 var cursor = db.foo.find({foo:"bar"}) .sort({"x":1}) 转换成普通的{"$query":{"foo":"bar"},"orderby":{"x":1}}

选项举例

$maxscan : integer 指定查询最多扫描的文档数量

$min : document 查询的开始条件

$max : document 查询的结束条件

$hint : document 指定服务器使用哪个索引进行查询

$explain : boolean 获取查询执行的细节(用到的索引、结果数量、耗时等),并非真正执行查询

$snapshot : boolean 确保查询的结果是在查询执行的那一刻的一致快照 如果使用了,查询就是针对不变的集合视图进行的,否则对游标的操作会影响集合

 

1、查询所有记录

db.userInfo.find();

相当于:select * from userInfo;

默认每页显示20条记录,当显示不下的情况下,可以用it迭代命令查询下一页数据。注意:键入it命令不能带“;”

但是你可以设置每页显示数据的大小,用DBQuery.shellBatchSize= 50;这样每页就显示50条记录了。

2、查询去掉后的当前聚集集合中的某列的重复数据

db.userInfo.distinct("name");

会过滤掉name中的相同数据

相当于:select distict name from userInfo;

3、查询age = 22的记录

db.userInfo.find({"age": 22});

相当于: select * from userInfo where age = 22;

4、查询age > 22的记录

db.userInfo.find({age: {$gt: 22}});

相当于:select * from userInfo where age >22;

5、查询age < 22的记录

db.userInfo.find({age: {$lt: 22}});

相当于:select * from userInfo where age <22;

6、查询age >= 25的记录

db.userInfo.find({age: {$gte: 25}});

相当于:select * from userInfo where age >= 25;

7、查询age <= 25的记录

db.userInfo.find({age: {$lte: 25}});

8、查询age >= 23 并且 age <= 26

db.userInfo.find({age: {$gte: 23, $lte: 26}});

9、查询name中包含 mongo的数据

db.userInfo.find({name: /mongo/});

//相当于%%

select * from userInfo where name like ‘%mongo%’;

10、查询name中以mongo开头的

db.userInfo.find({name: /^mongo/});

select * from userInfo where name like ‘mongo%’;

11、查询指定列name、age数据

db.userInfo.find({}, {name: 1, age: 1});

相当于:select name, age from userInfo;

当然name也可以用true或false,当用ture的情况下河name:1效果一样,如果用false就是排除name,显示name以外的列信息。

12、查询指定列name、age数据, age > 25

db.userInfo.find({age: {$gt: 25}}, {name: 1, age: 1});

相当于:select name, age from userInfo where age >25;

13、按照年龄排序

升序:db.userInfo.find().sort({age: 1});

降序:db.userInfo.find().sort({age: -1});

14、查询name = zhangsan, age = 22的数据

db.userInfo.find({name: 'zhangsan', age: 22});

相当于:select * from userInfo where name = ‘zhangsan’ and age = ‘22’;

15、查询前5条数据

db.userInfo.find().limit(5);

相当于:selecttop 5 * from userInfo;

16、查询10条以后的数据

db.userInfo.find().skip(10);

相当于:select * from userInfo where id not in (

select top 10 * from userInfo

);

17、查询在5-15之间的数据

db.userInfo.find().limit(10).skip(5);

可用于分页,limit是pageSize,skip是第几页*pageSize

18、or与 查询

db.userInfo.find({$or: [{age: 22}, {age: 25}]});

相当于:select * from userInfo where age = 22 or age = 25;

19、查询第一条数据

db.userInfo.findOne();

相当于:select * from userInfo where rownum = 1;

db.userInfo.find().limit(1);

20、查询某个结果集的记录条数

db.userInfo.find({age: {$gte: 25}}).count();

相当于:select count(*) from userInfo where age >= 20;

21、按照某列进行排序

db.userInfo.find({sex: {$exists: true}}).count();

相当于:select count(sex) from userInfo;

 

 

 

 

 

分享到:
评论

相关推荐

    NoSQL.Manager.for.MongoDB.v.3.1.0.5

    2. **NoSQL Manager for MongoDB 功能** - 数据库和集合管理:创建、删除、查看和修改数据库及集合。 - 文档操作:支持插入、更新、删除、查询单个或批量文档,以及导入导出数据。 - 图形化查询构建器:允许用户...

    Python库 | jaraco.mongodb-9.4b5.tar.gz

    - 数据集合操作:创建、查询、更新和删除集合,这是MongoDB中的数据存储单元。 - 文档操作:插入、查找、修改和删除文档,文档是MongoDB中的数据结构,类似于JSON对象。 - 查询优化:利用索引提升查询性能,避免全表...

    Java连接mongoDB需要的jar包(3.9.1)

    2. `mongodb-driver-3.9.1.jar`: 这是MongoDB Java驱动的主要部分,提供了与MongoDB服务器通信所需的类和接口。它实现了连接管理、命令执行、查询和写入操作等功能。开发者可以使用这个库来创建MongoClient实例,...

    The.Definitive.Guide.to.MongoDB.pdf

    3. **高级查询技术**:介绍MongoDB的查询语言,包括聚合框架、文本搜索、地理位置查询等高级功能,帮助开发者构建复杂的查询逻辑。 4. **性能优化和调优**:提供了一系列提高MongoDB性能的策略和方法,如索引设计、...

    mongodb.dll 下载.zip

    2. **数据模型**:MongoDB使用文档型数据模型,文档是BSON(Binary JSON)格式,类似于JSON但包含更多数据类型。 3. **数据库操作**:包括创建、读取、更新和删除(CRUD)操作。例如,`db.collection.insertOne()`...

    .MongoDB.The.Definitive.Guide

    - **更多特点**: 除了上述提到的特点外,MongoDB还具有许多其他优点,例如强大的查询语言、实时聚合框架等。 - **第2章: 入门**: - **文档**: MongoDB中数据的基本单位是文档(document),它是由键值对组成的JSON-...

    MongoDB The Definitive Guide 3rd Edition.pdf

    2. MongoDB的数据类型:MongoDB支持多种数据类型,包括String、Integer、Long、Double、Boolean、Array、Object、Null等。 MongoDB还支持嵌套文档和数组类型。 3. MongoDB的数据模型:MongoDB的数据模型是基于文档...

    Pro.MongoDB.Development.2015 (英文pdf+源码)

    3. **查询与聚合**:详细解析了MongoDB的查询语言,包括查询操作符、投影、排序、分页等。此外,还深入讨论了聚合框架,用于处理复杂的数据分析和报告需求。 4. **性能优化**:讲述了如何监控和优化MongoDB的性能,...

    MongoDB c#驱动 dll

    2. MongoDB.Driver.Core.dll:这是MongoDB驱动的核心组件,负责处理与MongoDB服务器的低级别通信。它包含网络连接、命令执行、会话管理等功能,为上层的MongoDB.Driver.dll提供基础支持。MongoDB.Driver.Core.dll...

    13.mongodb.rar

    2. **集合(Collections)**:集合是MongoDB中的表,它是由一系列文档组成的。集合不需要预先定义模式,允许灵活的数据模型。 3. **数据库(Databases)**:数据库是MongoDB中存储数据的地方,每个数据库有自己的...

    MongoDB 45 道面试题及答案.docx

    2. MongoDB 中的“命名空间”是指集合名称和数据库名称的串联。 3. MongoDB 中的分片是指在多台计算机上存储数据记录的过程,可以满足数据增长的需求。 MongoDB 集合和文档 1. MongoDB 中的集合是指存储 BSON ...

    C#访问MongoDB DLL

    2. MongoDB.Driver.Core.dll: 这是MongoDB .NET驱动程序的核心组件,提供了与MongoDB服务器通信的基础架构。它包括连接管理、认证、心跳检测、错误处理等功能。例如,MongoClient类就是这个库的一部分,它负责建立...

    mongodb-linux-x86_64-rhel70-4.2.14.tgz

    2. **全文搜索**:这个版本添加了内置的全文搜索引擎,允许用户在数据库中进行复杂和高效的文本搜索。 3. **BSON JSON模块**:提供了对BSON(二进制JSON)文档的原生支持,提升了性能和灵活性。 4. **聚合管道优化...

    mongodb安装包和compass

    通过Node.js的MongoDB驱动,你可以编写JavaScript代码来与MongoDB交互,创建和查询集合,执行CRUD(创建、读取、更新、删除)操作。而Compass则提供了直观的视图,让你可以看到这些操作在数据库中的实际效果。 总之...

    MongoDB企业级分片集群搭建视频.zip

    2 MongoDB服务器的启动优化.mp4 3 MongoDB客户端基础使用.mp4 4 MongoDB集合的多种查询条件.mp4 5 MongoDB索引查询与建立.mp4 6 MongoDB数据库的监控命令.mp4 7 MongoDB副本集的搭建.mp4 8 MongoDB副本集故障自动...

    MongoDBTest.

    2. **分布式架构**:MongoDB支持水平扩展,通过分片和复制集实现高可用性和可扩展性。这意味着可以在集群中添加更多的服务器以提高性能和数据安全性。 3. **查询语言**:MongoDB的查询语言(MQL)类似于JSON,提供...

Global site tag (gtag.js) - Google Analytics