千家信息网

MongoDB(3): 查询

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,一、普通查询find方法语法:find([条件,需显示的字段]);注意:1、如果没有条件,则查询全部2、如果没有显示指定_id字段隐藏,则默认会显示,显示指定隐藏,如:find({},{"_id":0
千家信息网最后更新 2026年11月01日MongoDB(3): 查询

一、普通查询

find方法语法:

find([条件,需显示的字段]);

注意:

1、如果没有条件,则查询全部

2、如果没有显示指定_id字段隐藏,则默认会显示,显示指定隐藏,如:find({},{"_id":0});

1.1、查看集合中所有的文档

命令:db.集合名称.find();

1.2、查看集合中第一个文档

命令:db.集合名称.findOne({条件对象});

1.3、指定需要返回的键

在find方法的第二个参数进行指定。默认情况下,始终会返回"_id",可以通过设置字段为0来表示不返回这个字段。

二、条件查询

find方法语法:

find([条件,需显示的字段]);


在find方法里面加入条件数据即可,find方法的第一个参数就是。

注意:条件数据必须是常量值,不能是另外的字段的数据


1:比较操作

$lt:小于

$lte:小于等于

$gt:大于

$gte:大于等于

$ne:不等于

如:a、age小于20

  > db.test1.find({"age":{$lt:20}});

b、age小于20,大于10

  > db.test1.find({"age":{$lt:20,$gt:10}});

2:$and:包含多个条件,他们之间为and的关系

> db.test1.find({$and:[{"userId":2},{"username":"lisi"}]});

等价于下面:

> db.test1.find({"userId":2,"username":"lisi"});

3:$or :包含多个条件,他们之间为or的关系 ,$nor相当于or取反

操作方式与$and差不多

4:$not:用作其他条件之上,取反

> db.test1.find({"userId":{$not:{$ne:3}}});> db.test1.find({"userId":{$not:/1/}});

5:$mod:将查询的值除以第一个给定的值,如果余数等于等二个值则匹配成功

> db.test1.find({"age":{$mod:[100,3]}});

说明:

age除以100,如果余数为3,则满足条件

6:$in :查询一个键的多个值,只要键匹配其中一个即可 , $nin为不包含

> db.test1.find({"userId":{$in:[1,2]}});

7:$all:键需要匹配所有的值

> db.test1.find({"userId":{$all:[1,2]}});

8:$exists:检查某个键是否存在,1表示存在,0表示不存在

> db.test1.find({"userId":{$exists:1}});

9:null类型:不仅能匹配键的值为null,还匹配键不存在的情况

> db.test1.find({"age":null});

三、正则表达式

MongoDB使用Perl兼容的正则表达式(PCRE),比如:

db.users.find({"name":/sishuok/i}); 又比如:

db.users.find({"name":/^sishuok/});

四、查询数组

1:单个元素匹配,就跟前面写条件一样,{key:value}

> db.test1.find({"score":5});

2:多个元素匹配,使用$all, {key:{$all:[a,b]}},元素的顺序无所谓

> db.test1.find({"score":{$all:[7,2]}});

3:可以使用索引指定查询数组特定位置, {"key.索引号":value}

> db.test1.find({"score.1":7});

4:查询某个长度的数组,使用$size

> db.test1.find({"score":{$size:5}})

5:指定子集,使用$slice,正数是前面多少条,负数是尾部多少条,也可以指定偏移量和要返回的元素数量,比如:$slice:[50,10]

> db.test1.find({},{"score":{$slice:2}});

指定偏移量和要返回的元素数量,比如:偏移量1,返回两个元素:

> db.test1.find({},{"score":{$slice:[1,2]}});

6:可以使用$来指定符合条件的任意一个数组元素,如:{"users.$":1}

> db.test1.find({"score":{$in:[2,5]}},{"score.$":1});

7:$elemMatch:要求同时使用多个条件语句来对一个数组元素进行比较判断

> db.test1.find({"score":{$gt:5,$lt:4}});{ "_id" : ObjectId("5925a29652b61a20c53dfd48"), "score" : [ 7 ] }>

说明:上面语句并不是我们想要的,"大于5,小于4",应该是不存在的,这里如果想让其生效,相当于and,则使用:$elemMatch

> db.test1.find({"score":{$elemMatch:{$gt:5,$lt:4}}});>

五、查询内嵌文档

1:查询整个内嵌文档与普通查询是一样的

2:如果要指定键值匹配,可以使用"." 操作符,比如:{"name.first":"a","name.last":"b"}

> db.test1.find({"user.id":1});{ "_id" : ObjectId("5925a2a552b61a20c53dfd49"), "user" : { "id" : 1, "username" : "zhangsan" } }>

3:如果要正确的指定一组条件,那就可能需要使用$elemMatch,以实现对内嵌文档的多个键进行匹配操作

只有内嵌文档中的有key的值是数组

注意:内嵌文档的查询必须要整个文档完全匹配

4:$where查询

在查询中执行任意的JavaScript,通过编程来解决查询的匹配问题,方法返回boolean值。

> function t1() {... for(var a in this) {...  if (a.userId==2) {...   return true;...  }... }... return false;... };> db.test1.find({$where:t1});

如果返回true,文档作为结果的一部分被返回;如果为false,则不会返回。

使用的时候:db.users.find({"$where":t1});

注意:$where性能较差,安全性也是问题,所以不到万不得已,不要使用


还可以这样:

> db.test1.find({$where:"this.userId==1"});

六、分页与其它相关

6.1、查询记录条数的命令:count

1:直接使用count()的话,得到的是整个记录的条数

> db.test1.find().count();4

2:如果要获取按条件查询后记录的条数,需要指定count(true或者非0的数)

> db.test1.find().limit(2).count();4> db.test1.find().limit(2).count(1);2>

6.2、限制返回的记录条数的命令:limit(要返回的条数)

> db.test1.find().limit(2);{ "_id" : ObjectId("5925a29652b61a20c53dfd48"), "userId" : "1", "age" : 13, "score" : [ 7, 7, 2, 5, 4 ] }{ "_id" : ObjectId("5925a2a552b61a20c53dfd49"), "user" : { "id" : 1, "username" : "zhangsan" } }>

6.3、限制返回的记录条数起点的命令:skip(从第几条开始返回)

> db.test1.find().skip(2).limit(2);{ "_id" : ObjectId("5926b15e52b61a20c53dfd4a"), "user" : { "id" : 2, "username" : "lisi" } }{ "_id" : ObjectId("5926b6ce31e6d30b1b5084cd"), "userId" : 5, "name" : "zhangsan" }>

6.4、排序的命令:sort({要排序的字段:1为升序,-1为降序})

> db.test1.find().sort({"userId":1});

对多个字段进行排序:

> db.test1.find().sort({"userId":1,"username":1});

MongoDB处理不同类型的数据是有一定顺序的,有时候一个键有多种类型的值,其排序顺序是预先定义好的,从小到大如下:

(1)最小值 (2)null (3)数字 (4)字符串

(5)对象/文档 (6)数组 (7)二进制数据 (8)对象id

(9)布尔类型 (10)日期型 (11)时间戳 (12)正则表达式

(13)最大值

6.5、分页查询:组合使用limit,skipt和sort

数据量比较小时,建议使用;当数据量比较大时,建议使用其他方式来分页,比如采用自定义的id,然后根据id来分页

skipt的检索方式:如果有100条数据,我想要第59条,那么skipt也会检索出前面58条,只是在第59条时返回。

6.6、查询给定键的所有不重复的数据,命令:distinct

语法:db.runCommand({"distinct":集合名,"key":"获得不重复数据的字段"});

> db.runCommand({"distinct":"test1","key":"userId"});{ "values" : [ "1", 5 ], "ok" : 1 }

七、游标

1:获取游标,示例如下:

> var c = db.test1.find();

2:循环游标,可以用集合的方式,示例如下:

> while(c.hasNext()){... printjson(c.next());... }

3:也可以使用forEach来循环,示例如下:

> c.forEach(function(obj){ ... printjson(obj); ... });

效果:

八、存储过程

1:MongoDB的存储过程其实就是个自定义的js函数

> var addf = function(a,b){... return a+b;... }>

2:使用db.system.js.save({"_id":名称,value:函数})存储函数;

> db.system.js.save({"_id":"myF","value":addf});

3:可以通过如下命令查看:db.system.js.find();

4:可以通过如下命令调用:db.eval(名称);


注意:尽量避免使用游标与游标

查询 条件 数据 文档 命令 字段 元素 多个 数组 方法 游标 名称 方式 类型 排序 函数 可以通过 对象 正则 示例 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 上海睿民互联网科技有限公司 互联网科技工作委员会主任 科技和互联网公司 智慧科技互联网 善班互联网科技有限公司 互联网 视角下的科技创新 深圳艾佳互联网科技 大白互联网科技 中国互联网金融科技基金 华脉科技工业互联网产品 互联网大会黑科技排名 互联网软件和科技 河南猎农互联网科技有限公司 乌苏新华互联网科技做什么的 特约风豹互联网科技为什么扣费 卓翼科技产业互联网合作 中天科技中国工业互联网 富国互联网金融科技混合基金 承德科技产业互联网平台 颐高云石互联网科技 重生之互联网科技帝国 互联网科技公司税收优惠 北京互联网络科技有限公司 阿里巴巴算科技企业还是互联网 随着互联网科技发展 华夏互联网科技业 半导体行业属于互联网高科技类吗 互联网高科技行业有哪些企业 北京天晋互联网科技有限公司 六子台科技互联网展会
0