MongoDB数据查询方法干货篇
发布时间 - 2026-01-11 00:54:58 点击率:次本文主要给大家介绍了MongoDB数据查询的相关内容,对大家具有一定的参考价值,需要的朋友们一起来学习学习吧。

导入测试数据
在开始之前我们应该先准备数据方便演示,这里我插入的了几条数据,数据如下:
db.user.insertMany(
[{
name:'jack',
age:22,
sex:'Man',
tags:['python','c++','c'],
grades:[22,33,44,55],
school:{
name:'shida',
city:'xuzhou'
}
},{
name:'jhon',
age:33,
sex:null,
tags:['python','java'],
grades:[66,22,44,88],
school:{
name:'kuangda',
city:'xuzhou'
}
},
{
name:'xiaoming',
age:33,
tags:['python','java'],
grades:[66,22,44,88],
school:{
name:'kuangda',
city:'xuzhou'
}
}
]
)
find()
其中query表示查找的条件,相当于mysql中where子句,projection列出你想要查找的数据,格式为db.collection.find(find(<query filter>, <projection>))
实例:
下面不带参数的查找,将会查找出所有的结果
db.find().pretty();
//输出结果
{
"_id" : ObjectId("59056f81299fe049404b2899"),
"name" : "jack",
"age" : 22,
"tags" : [
"python",
"c++",
"c"
],
"grades" : [
22,
33,
44,
55
],
"school" : {
"name" : "shida",
"city" : "xuzhou"
}
}
下面找出满足name为jack的数据,并且只输出name,age,这里的_id是默认输出的,如果不想输出将将它设置为0,想要输出那个字段将它设置为1
db.user.find({name:'jack'},{name:1,age:1})
//输出结果
{ "_id" : ObjectId("59056f81299fe049404b2899"), "name" : "jack", "age" : 22 }
db.user.find({name:'jack'},{name:1,age:1,_id:0})
//输出结果
{"name" : "jack", "age" : 22 }
**注意:这里的一个 projection不能 同时 指定包括和排除字段,除了排除 _id字段。 在 显式包括 字段的映射中,_id 字段是唯一一个您可以 显式排除 的。
查询内嵌文档
上述例子中插入的school数据就表示内嵌文档
完全匹配查询
完全匹配查询表示school中的查询数组必须和插入的数组完全一样,顺序都必须一样才能查找出来
db.user.find({name:'jack',school:{name:'shida',city:'xuzhou'}});
//输出结果
{ "_id" : ObjectId("59056f81299fe049404b2899"), "name" : "jack", "age" : 22, "tags" : [ "python", "c++", "c" ], "grades" : [ 22, 33, 44, 55 ], "school" : { "name" : "shida", "city" : "xuzhou" } }
//下面是指定输出的字段,这里的school.name表示只输出school文档中name字段,必须加引号
db.user.find({name:'jack',school:{name:'shida',city:'xuzhou'}},{name:1,age:1,'school.name':1});
//输出结果
{ "_id" : ObjectId("59056f81299fe049404b2899"), "name" : "jack", "age" : 22, "school" : { "name" : "shida" } }
键值对查询
可以通过键值对查询,不用考虑顺序,比如 'school.name':'shida' ,表示查询学校名字为shida的数据,这里的引号是必须要的
db.user.find({'school.name':'shida'},{name:1,school:1});
//输出结果
{ "_id" : ObjectId("59056f81299fe049404b2899"), "name" : "jack", "school" : { "name" : "shida", "city" : "xuzhou" } }
查询操作符
下面我们将配合查询操作符来执行复杂的查询操作,比如元素查询、 逻辑查询 、比较查询操作。我们使用下面的比较操作符"$gt" 、"$gte"、 "$lt"、 "$lte"(分别对应">"、 ">=" 、"<" 、"<=")
实例
下面查询年龄在20-30之间的信息
db.user.find({
age:{$gt:20,$lt:30}
})
//输出
{ "_id" : ObjectId("59056f81299fe049404b2899"), "name" : "jack", "age" : 22, "tags" : [ "python", "c++", "c" ], "grades" : [ 22, 33, 44, 55 ], "school" : { "name" : "shida", "city" : "xuzhou" } }
$ne
$ne表示不相等,例如查询年龄不等于22岁的信息
db.user.find({age:{$ne:22}})
//输出
{ "_id" : ObjectId("59057c16f551d8c9003d31e0"), "name" : "jhon", "age" : 33, "tags" : [ "python", "java" ], "grades" : [ 66, 22, 44, 88 ], "school" : { "name" : "kuangda", "city" : "xuzhou" } }
slice
$slice操作符控制查询返回的数组中元素的个数。此操作符根据参数{ field: value } 指定键名和键值选择出文档集合,并且该文档集合中指定array键将返回从指定数量的元素。如果count的值大于数组中元素的数量,该查询返回数组中的所有元素的。
语法:db.collection.find( { field: value }, { array: {$slice: count }});
下面将查询grades中的前两个数
db.user.find({name:'jack'},{grades:{$slice:2},name:1,age:1,'school.name':1});
//输出,可以看出这里的grades只输出了前面两个
{ "_id" : ObjectId("59057c16f551d8c9003d31df"), "name" : "jack", "age" : 22, "grades" : [ 22, 33 ], "school" : { "name" : "shida" } }
下面将输出后3个数据
db.user.find({name:'jhon'},{grades:{$slice:-3},name:1});
//输出
{ "_id" : ObjectId("59057c16f551d8c9003d31e0"), "name" : "jhon", "grades" : [ 22, 44, 88 ] }
下面介绍指定一个数组作为参数。数组参数使用[ skip , limit ] 格式,其中第一个值表示在数组中跳过的项目数,第二个值表示返回的项目数。
db.user.find({name:'jack'},{grades:{$slice:[2,2]},name:1}); //这里将会跳过前面的两个,直接得到后面的两个数据
//输出
{ "_id" : ObjectId("59057c16f551d8c9003d31df"), "name" : "jack", "grades" : [ 44, 55 ] }
$exists
如果$exists的值为true,选择存在该字段的文档,若值为false则选择不包含该字段的文档
下面将会查询不存在sex这一项的信息
db.user.find({sex:{$exists:false}})
//结果
{ "_id" : ObjectId("59058460fe58ed1089f2a5cd"), "name" : "xiaoming", "age" : 33, "tags" : [ "python", "java" ], "grades" : [ 66, 22, 44, 88 ], "school" : { "name" : "kuangda", "city" : "xuzhou" } }
db.user.find({sex:{$exists:true}});
//结果
{ "_id" : ObjectId("59058460fe58ed1089f2a5cb"), "name" : "jack", "age" : 22, "sex" : "Man", "tags" : [ "python", "c++", "c" ], "grades" : [ 22, 33, 44, 55 ], "school" : { "name" : "shida", "city" : "xuzhou" } }
{ "_id" : ObjectId("59058460fe58ed1089f2a5cc"), "name" : "jhon", "age" : 33, "sex" : null, "tags" : [ "python", "java" ], "grades" : [ 66, 22, 44, 88 ], "school" : { "name" : "kuangda", "city" : "xuzhou" } }
$or
执行逻辑OR运算,指定一个至少包含两个表达式的数组,选择出至少满足数组中一条表达式的文档。
语法: { $or: [ { <expression1> }, { <expression2> }, ... , { <expressionN> } ] }
下面将要查找age等于22或者age等于33的值
db.user.find({$or:[{age:22},{age:33}]})
//结果
{ "_id" : ObjectId("59058460fe58ed1089f2a5cb"), "name" : "jack", "age" : 22, "sex" : "Man", "tags" : [ "python", "c++", "c" ], "grades" : [ 22, 33, 44, 55 ], "school" : { "name" : "shida", "city" : "xuzhou" } }
{ "_id" : ObjectId("59058460fe58ed1089f2a5cc"), "name" : "jhon", "age" : 33, "sex" : null, "tags" : [ "python", "java" ], "grades" : [ 66, 22, 44, 88 ], "school" : { "name" : "kuangda", "city" : "xuzhou" } }
{ "_id" : ObjectId("59058460fe58ed1089f2a5cd"), "name" : "xiaoming", "age" : 33, "tags" : [ "python", "java" ], "grades" : [ 66, 22, 44, 88 ], "school" : { "name" : "kuangda", "city" : "xuzhou" } }
下面将会查找出年龄为22或者33并且姓名为jack的人的信息
db.user.find({name:'jack',$or:[{age:33},{age:22}]})
//结果
{ "_id" : ObjectId("59058460fe58ed1089f2a5cb"), "name" : "jack", "age" : 22, "sex" : "Man", "tags" : [ "python", "c++", "c" ], "grades" : [ 22, 33, 44, 55 ], "school" : { "name" : "shida", "city" : "xuzhou" } }
$and
指定一个至少包含两个表达式的数组,选择出满足该数组中所有表达式的文档。$and操作符使用短路操作,若第一个表达式的值为“false”,余下的表达式将不会执行。
语法: { $and: [ { <expression1> }, { <expression2> } , ... , { <expressionN> } ] }
下面将会查找年龄在20-30之间的信息,对于下面使用逗号分隔符的表达式列表,MongoDB会提供一个隐式的$and操作:
db.user.find({$and:[{age:{$gt:20}},{age:{$lt:30}}]})
//上述语句相当于db.user.find({age:{$gt:20},age:{$lt:30}})
//结果
{ "_id" : ObjectId("59058460fe58ed1089f2a5cb"), "name" : "jack", "age" : 22, "sex" : "Man", "tags" : [ "python", "c++", "c" ], "grades" : [ 22, 33, 44, 55 ], "school" : { "name" : "shida", "city" : "xuzhou" } }
$in
匹配键值等于指定数组中任意值的文档。类似sql中in,只要匹配一个value就会输出
语法: { field: { $in: [<value1>, <value2>, ... <valueN> ] } }
下面将会查找grades中存在22,33之间的任意一个数的信息
db.user.find({grades:{$in:[22,33]}})
//输出
{ "_id" : ObjectId("59058460fe58ed1089f2a5cb"), "name" : "jack", "age" : 22, "sex" : "Man", "tags" : [ "python", "c++", "c" ], "grades" : [ 22, 33, 44, 55 ], "school" : { "name" : "shida", "city" : "xuzhou" } }
{ "_id" : ObjectId("59058460fe58ed1089f2a5cc"), "name" : "jhon", "age" : 33, "sex" : null, "tags" : [ "python", "java" ], "grades" : [ 66, 22, 44, 88 ], "school" : { "name" : "kuangda", "city" : "xuzhou" } }
{ "_id" : ObjectId("59058460fe58ed1089f2a5cd"), "name" : "xiaoming", "age" : 33, "tags" : [ "python", "java" ], "grades" : [ 66, 22, 44, 88 ], "school" : { "name" : "kuangda", "city" : "xuzhou" } }
$nin
匹配键不存在或者键值不等于指定数组的任意值的文档。类似sql中not in(SQL中字段不存在使用会有语法错误).
查询出grades中不存在100或者44的文档
db.user.find({grades:{$nin:[100,44]}})
$not
执行逻辑NOT运算,选择出不能匹配表达式的文档 ,包括没有指定键的文档。$not操作符不能独立使用,必须跟其他操作一起使用
语法: { field: { $not: { } } }
查询年龄不大于30的信息
db.user.find({age:{$not:{$gt:30}}})
//输出
{ "_id" : ObjectId("59058460fe58ed1089f2a5cb"), "name" : "jack", "age" : 22, "sex" : "Man", "tags" : [ "python", "c++", "c" ], "grades" : [ 22, 33, 44, 55 ], "school" : { "name" : "shida", "city" : "xuzhou" } }
迭代游标的查询
学过高级语言的朋友都知道迭代的问题,像java,下面使用迭代的方法查询
var cursor=db.usr.find();
//这里使用迭代输出所有的数据
while(cursor.hasNext()) //这里的hasNext()是判断是否下一个中还有可迭代的值,如果没有返回false
{
printjson(cursor.next()); //这里的cursor.next是迭代的输出,printjson是代替print(tojson())
}
print cursor.count() //输出其中有多少个数据
cursor.forEach(printjson); //forEach输出
var document=cursor.toArray(); //将迭代对象转换成数组
print document[0]; //以数组的形式输出
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对的支持。
# mongodb查询语句
# mongodb教程
# mongodb统计查询
# MongoDB数据库条件查询技巧总结
# MongoDB基础之查询文档
# 常用的MongoDB查询语句的示例代码
# 详解MongoDB的条件查询和排序
# MongoDB查询之高级操作详解(多条件查询、正则匹配查询等)
# MongoDB多条件模糊查询示例代码
# MongoDB 查询操作的实例详解
# MongoDB的查询方法
# MongoDB的一些常用查询方法
# MongoDB实现查询、分页和排序操作以及游标的使用
# 文档
# 将会
# 组中
# 迭代
# 键值
# 不存在
# 值为
# 第一个
# 将它
# 设置为
# 不等于
# 跳过
# 内嵌
# 年龄在
# 的人
# 这一
# 就会
# 会有
# 子句
# 相关内容
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel Telescope怎么调试_使用Laravel Telescope进行应用监控与调试
Laravel路由Route怎么设置_Laravel基础路由定义与参数传递规则【详解】
JS中页面与页面之间超链接跳转中文乱码问题的解决办法
魔方云NAT建站如何实现端口转发?
Laravel如何正确地在控制器和模型之间分配逻辑_Laravel代码职责分离与架构建议
Swift中循环语句中的转移语句 break 和 continue
米侠浏览器网页背景异常怎么办 米侠显示修复
如何批量查询域名的建站时间记录?
如何获取上海专业网站定制建站电话?
微信小程序制作网站有哪些,微信小程序需要做网站吗?
1688铺货到淘宝怎么操作 1688一键铺货到自己店铺详细步骤
HTML透明颜色代码怎么让图片透明_给img元素加透明色的技巧【方法】
php嵌入式断网后怎么恢复_php检测网络重连并恢复硬件控制【操作】
免费网站制作appp,免费制作app哪个平台好?
如何快速搭建高效香港服务器网站?
Claude怎样写结构化提示词_Claude结构化提示词写法【教程】
Laravel怎么实现一对多关联查询_Laravel Eloquent模型关系定义与预加载【实战】
jQuery validate插件功能与用法详解
Laravel distinct去重查询_Laravel Eloquent去重方法
Laravel N+1查询问题如何解决_Eloquent预加载(Eager Loading)优化数据库查询
UC浏览器如何切换小说阅读源_UC浏览器阅读源切换【方法】
中山网站制作网页,中山新生登记系统登记流程?
Laravel怎么在Controller之外的地方验证数据
高性能网站服务器配置指南:安全稳定与高效建站核心方案
Laravel怎么进行浏览器测试_Laravel Dusk自动化浏览器测试入门
简历在线制作网站免费版,如何创建个人简历?
HTML5空格和margin有啥区别_空格与外边距的使用场景【说明】
Bootstrap整体框架之JavaScript插件架构
网站制作软件免费下载安装,有哪些免费下载的软件网站?
Win11怎么设置虚拟桌面 Win11新建多桌面切换操作【技巧】
如何使用 jQuery 正确渲染 Instagram 风格的标签列表
Laravel如何使用模型观察者?(Observer代码示例)
如何在香港免费服务器上快速搭建网站?
如何利用DOS批处理实现定时关机操作详解
在线教育网站制作平台,山西立德教育官网?
高防服务器:AI智能防御DDoS攻击与数据安全保障
Laravel怎么集成Vue.js_Laravel Mix配置Vue开发环境
Laravel Asset编译怎么配置_Laravel Vite前端构建工具使用
JavaScript模板引擎Template.js使用详解
原生JS实现图片轮播切换效果
北京网站制作的公司有哪些,北京白云观官方网站?
阿里云网站搭建费用解析:服务器价格与建站成本优化指南
Laravel API资源(Resource)怎么用_格式化Laravel API响应的最佳实践
Windows10如何删除恢复分区_Win10 Diskpart命令强制删除分区
JavaScript数据类型有哪些_如何准确判断一个变量的类型
Python自动化办公教程_ExcelWordPDF批量处理案例
Python3.6正式版新特性预览
千问怎样用提示词获取健康建议_千问健康类提示词注意事项【指南】
如何选择可靠的免备案建站服务器?
JavaScript如何实现继承_有哪些常用方法

