详解MongoDB的条件查询和排序


Posted in MongoDB onJune 23, 2021
目录
  • find 方法
  • 条件组合
  • 比较操作符
  • IN 查询
  • 限制返回结果条数和跳过数据
  • 排序
  • 总结

 

find 方法

查询的基本格式是db.collection.find({条件}),其中条件是可选的,类似于 MySQL 的 WHERE 条件一样。示例如下:

//  查找全部文档
db.collection.find({});
// 查找指定条件的文档
db.collection.find({key: value});
// 查找昵称为岛上码农的用户
db.users.find({nickname: '岛上码农'});

 

条件组合

可以使用 $and、$or 和 $not 来设置组合条件。

// AND 查询格式
db.collection.find({
  $and: [
    {key1: value1}, {key2: value2}
  ]
});

// OR 查询格式
db.collection.find({
  $or: [
    {key1: value1}, {key2: value2}
  ]
});

// NOT 查询格式
db.collection.find(
    {key: {$not: {条件表达式}}
);

例如下面的 users数据集:

[
  {nickname: '岛上码农', score: 90, gender: 'male'}, 
  {nickname: '玛丽', score: 98, gender: 'female'}, 
  {nickname: 'Tom', score: 76, gender: 'male'}
]

查找分数是90或76分的用户:

db.users.find({
  $or: [
    {score: 90}, {score: 76}
  ]
});

查找性别不是 male 的用户和查找分数高于80分用户:

db.users.find({
  gender: {$not: {$eq: 'male'}}
});

db.users.find({
  score: {$not: {$lt: 80}}
});

其中$eq为相等条件,$lt为小于条件。 条件可以嵌套使用,例如and和and和or 嵌套,表示(a || b) && (c || d),格式如下:

// AND与OR 嵌套查询格式
db.collection.find({
  $and: [
    {$or: [{key1: value1}, {key2: value2}]},
    {$or: [{key3: value1}, {key4: value2}]},
  ]
});
//查找 nickename是岛上码农或玛丽,且分数是90或76的用户
db.users.find({
  $and: [
    {$or: [{nickname: '岛上码农'}, {nickname: '玛丽'}]},
    {$or: [{score: 90}, {score: 76}]}
  ]
});
//查找 nickname是岛上码农且分数是90,或nickname是玛丽且分数是76的用户
db.users.find({
  $or: [
    {$and: [{nickname: '岛上码农'}, {score: 90}]},
    {$and: [{nickname: '玛丽'}, {score: 76}]}
  ]
});
//查找nickname是岛上码农,且分数不低于80分的用户
db.users.find({
  $and: [
    {nickname: '岛上码农'},
    {score: {$not:{$lt: 80}}}
  ]
});

 

比较操作符

在 MongoDB 提供了如下比较操作符,比较操作符的格式为{key: {$op: value}}:

  • $eq:相等操作符,即 a == b;
  • $gt:大于,即 a > b;
  • $gte:大于等于,即 a >= b;
  • $lt:小于,即 a < b;
  • $lte:小于等于,即 a <= b。

 

IN 查询

in 查询的格式和比较操作符类似,只是对应的值是数组,即

db.collection.find({key: {$in: [...]}});

例如,需要查找分数为90,76的用户:

db.users.find({score: {$in: [76, 90]}});

in 查询也可以和其他条件组合,如and 查询:

db.users.find({
 $and: [
   {score: {$in: [76, 90]}},
   {gender: 'male'}
   ]
});

 

限制返回结果条数和跳过数据

find 方法会将所有匹配条件的数据查找出来,因此对于数据集很大的时候会导致速度很慢且产生大量的 磁盘 I/O,如果确定数据只有1条的时候可以使用 findOne,如果要限制查询条数可以使用 limit或 skip。limit 是查询到指定数量后的结果就返回,而 skip 是跳过前面指定数量的结果。

// 查找指定条件的文档的 n 条数据
db.collection.find({key: value}).limit(n);
//示例:查询超过80分的3个用户
db.users.find({score: {$gt: 80}}).limit(3);
// 查找指定条件的文档的,跳过前 n 条数据
db.collection.find({key: value}).skip(n);
//示例: 查询超过80分的用户,跳过前3个
db.users.find({score: {$gt: 80}}).skip(3);

 

排序

排序使用格式如下:

db.collection.find({条件}).sort({key: 1});

其中1表示升序,-1表示降序,例如我们需要以分数降序排序:

db.users.find().sort({score: -1});

 

总结

本篇介绍了 MongoDB 的条件查询操作,限制返回条数和排序。可以看到,MongoDB 的操作虽然语法和 SQL 不同,但是都有对应的功能辅助查询,对于查询来说也是十分便捷的。

以上就是详解MongoDB的条件查询和排序的详细内容,更多关于MongoDB的条件查询和排序的资料请关注三水点靠木其它相关文章!

MongoDB 相关文章推荐
MongoDB使用profile分析慢查询的步骤
Apr 30 MongoDB
浅析MongoDB之安全认证
Jun 26 MongoDB
mongodb的安装和开机自启动详细讲解
Aug 02 MongoDB
mongodb清除连接和日志的正确方法分享
Sep 15 MongoDB
关于CentOS 8 搭建MongoDB4.4分片集群的问题
Oct 24 MongoDB
MongoDB连接数据库并创建数据等使用方法
Nov 27 MongoDB
剖析后OpLog订阅MongoDB的数据变更就没那么难了
Feb 24 MongoDB
MongoDB数据库部署环境准备及使用介绍
Mar 21 MongoDB
MongoDB支持的索引类型
Apr 11 MongoDB
Mongodb 迁移数据块的流程介绍分析
Apr 18 MongoDB
MongoDB数据库之添删改查
Apr 26 MongoDB
MongoDB使用profile分析慢查询的步骤
Apr 30 #MongoDB
MongoDB balancer的使用详解
Apr 30 #MongoDB
MongoDB数据库的安装步骤
Jun 18 #MongoDB
MongoDB数据库常用的10条操作命令
Jun 18 #MongoDB
MongoDB 常用的crud操作语句
Jun 20 #MongoDB
MongoDB orm框架的注意事项及简单使用
Jun 20 #MongoDB
SpringBoot整合MongoDB的实现步骤
Jun 23 #MongoDB
You might like
PHP 根据IP地址控制访问的代码
2010/04/22 PHP
Windows中使用计划任务自动执行PHP程序实例
2014/05/09 PHP
初识php MVC
2014/09/10 PHP
LINUX下PHP程序实现WORD文件转化为PDF文件的方法
2016/05/13 PHP
PHP redis实现超迷你全文检索
2017/03/04 PHP
PHP检查文件是否存在,不存在自动创建及读取文件内容操作示例
2020/01/23 PHP
使用JS或jQuery模拟鼠标点击a标签事件代码
2014/03/10 Javascript
2014最热门的JavaScript代码高亮插件推荐
2014/11/25 Javascript
使用js画图之圆、弧、扇形
2015/01/12 Javascript
详解Jquery 遍历数组之$().each方法与$.each()方法介绍
2017/01/09 Javascript
javaScript嗅探执行神器-sniffer.js
2017/02/14 Javascript
提高Web性能的前端优化技巧总结
2017/02/27 Javascript
详解Angular5/Angular6项目如何添加热更新(HMR)功能
2018/10/10 Javascript
手把手15分钟搭一个企业级脚手架
2019/09/16 Javascript
vue+axios 拦截器实现统一token的案例
2020/09/11 Javascript
[45:40]Ti4 冒泡赛第二天NEWBEE vs NaVi 1
2014/07/15 DOTA
[06:01]刀塔次级联赛top10第一期
2014/11/07 DOTA
Ubuntu 14.04+Django 1.7.1+Nginx+uwsgi部署教程
2014/11/18 Python
用Python登录Gmail并发送Gmail邮件的教程
2015/04/17 Python
python非递归全排列实现方法
2017/04/10 Python
老生常谈python的私有公有属性(必看篇)
2017/06/09 Python
Python使用pip安装报错:is not a supported wheel on this platform的解决方法
2018/01/23 Python
Tensorflow之构建自己的图片数据集TFrecords的方法
2018/02/07 Python
Python3利用Dlib19.7实现摄像头人脸识别的方法
2018/05/11 Python
python实现简单flappy bird
2018/12/24 Python
python3.7 利用函数os pandas利用excel对文件名进行归类
2019/09/29 Python
python图形开发GUI库pyqt5的基本使用方法详解
2020/02/14 Python
python 在右键菜单中加入复制目标文件的有效存放路径(单斜杠或者双反斜杠)
2020/04/08 Python
python有几个版本
2020/06/17 Python
Pharmacy Online中文直邮网站:澳洲大型药房
2020/06/27 全球购物
植物生产学专业求职信
2014/08/08 职场文书
2014年旅游局法制宣传日活动总结
2014/11/01 职场文书
2015年财务经理工作总结
2015/05/13 职场文书
小学英语教学经验交流材料
2015/11/02 职场文书
2016中秋晚会开幕词
2016/03/03 职场文书
Java中使用Filter过滤器的方法
2021/06/28 Java/Android