三、mongdb 查询
一、 MongoDB文档检索
MongoDB中有多种方式可以检索文档:
1.1 查询过滤器
使用查询过滤器从集合中检索文档。查询过滤器是一组键值对,可按字段值查询文档。
例如:
db.col.find({"status":"A"})
这个示例查询status等于“A”的文档。
1.2 范围查询操作符
范围查询操作符可用于构建基于值范围的查询过滤器。例如:
- lt、lt、lt、lte、gt、gt、gt、gte:分别表示less than、less than or equal、greater than、greater than or equal。
- $in:匹配数组中任一值
- $nin:匹配不在数组中的任何值
例如:
db.col.find({"age":{"$gt":20,"$lt":30}})
这个示例查询age在20到30之间的文档。
1.3 正则表达式
可以使用正则表达式查询字符串字段的值。使用$regex操作符指定正则表达式。
例如:
db.col.find({"name": {"$regex" : /^A/}})
这个示例查询以A开头的name字段的文档。
1.4 投影操作
可以使用投影操作从文档中选择需要的字段。使用$project操作指定要包含/排除的字段。
例如:
db.col.find({},{"name":1,"address":1})
这个示例查询所有文档,但只返回name和address字段。_id字段默认返回,需要显式排除。
1.5 排序
可以使用$sort操作对结果进行排序。
例如:
db.col.find().sort({"age":1})
这个示例查询所有文档,并按age字段升序排列结果。
1.6 限制结果数量
可以使用$limit操作限制结果数量。例如:
db.col.find().limit(5)
这个示例查询最多5个文档。
1.7 跳过结果数量
可以使用$skip操作跳过结果数量。例如:
db.col.find().skip(10).limit(5)
这个示例跳过前10个结果,然后返回接下来的5个结果。
1.8 索引
可以在字段上创建索引以加快查询速度。确保索引字段是你查询过滤器和排序操作中使用的字段。
例如,如果经常按age字段查询文档,那么在age字段上创建索引将大大提高查询性能。
索引可在创建集合时指定,也可随时添加/删除。
例如,创建age索引:
db.col.createIndex({"age":1})
1.9 文本索引
可以在字符串字段上创建文本索引,以便执行文本搜索查询。
例如,如果有一个内容字段包含文章文本,则可以在该字段上创建文本索引,然后执行基于关键字的搜索查询。
例如,创建内容文本索引:
db.col.createIndex({"内容": "text"})
然后可以执行文本搜索:
db.col.find({"$text": {"$search": "mongodb 文档检索"}})
这个示例找到包含“mongodb 文档检索”的内容字段的文档。
1.10 地理空间索引
可以在包含GeoJSON对象的字段上创建2dsphere索引,以执行地理空间操作(例如查询附近的点)。
例如,如果有一个位置字段包含点的经度和纬度,可以在该字段上创建2dsphere索引:
db.places.createIndex({“位置”: “2dsphere”})
然后可以执行地理空间查询,如查询某点附近100千米内的文档:
db.places.find({
"位置": {
"$near": {
"$geometry": {
"type": "Point",
"coordinates": [x, y]
},
"$maxDistance": 100000
}
}
})
这个示例找到位置字段中点距离(x,y)100千米内的文档。
1.11 执行查询
可以通过以下方式执行MongoDB查询:
- db.col.find()
- db.col.findOne() //查询一个文档
- db.col.find().limit(n) //限制n个结果
- db.col.find().skip(n) //跳过前n个结果
- db.col.find().sort({…}) //排序结果
- db.col.findOne({ … }, { field: 1 }) //只返回指定字段
- db.col.count({ … }) //统计结果数量
- db.col.distinct(field) //获取指定字段的不同值
可以使用pretty()方法以易读的方式查看查询结果。
例如:
db.col.find().pretty()
在MongoDB Compass中也可以视觉化执行查询、查看查询执行计划和索引使用情况。
二、MongoDB聚合框架
MongoDB的聚合框架提供了管道操作,用于处理数据记录并返回计算结果。
聚合管道是把多个操作符链接在一起的过程。每个操作符会接收输入文档,对其进行转换处理,然后输出。
下面是一些常用的聚合操作符:
2.1 聚合框架
MongoDB的聚合框架提供了管道操作,可用于执行复杂的聚合查询。
例如,以下聚合管道查询获取age字段平均值大于$avg的文档数量:
db.col.aggregate([
{"$group": {"_id": "null", "avgAge": {"$avg": "$age"}}},
{"$addFields": {"age": "$age"}},
{"$match": {"age": {"$gt": "$avgAge"}}}
])
这个示例使用group阶段计算age平均值,然后group阶段计算age平均值,然后group阶段计算age平均值,然后addFields重新添加age字段,最后$match过滤age大于平均值的文档。
2.2 $group
将集合中的文档分组,可用于统计结果。
例如,按性别分组并计数:
db.users.aggregate([
{"$group": {"_id": "$gender", "count": {"$sum": 1}}}
])
这个示例会给出gender字段为male和female的文档数量。
2.3 $match
在聚合管道中过滤数据。与db.col.find()类似,但在聚合操作符中使用。
例如,只聚合年龄大于30的用户:
db.users.aggregate([
{"$match": {"age": {"$gt": 30}}},
{"$group": {"_id": "$gender", "count": {"$sum": 1}}}
])
2.4 $sort
在管道中对结果进行排序。
例如,按count降序排序结果:
db.users.aggregate([
{"$group": {"_id": "$gender", "count": {"$sum": 1}}},
{"$sort": {"count": -1}}
])
2.5 limit和limit和limit和skip
在管道中限制和跳过结果数量。
例如,跳过前5个结果,然后返回5个结果:
db.users.aggregate([
{"$group": {"_id": "$gender", "count": {"$sum": 1}}},
{"$sort": {"count": -1}},
{"$skip": 5},
{"$limit": 5}
])
2.6 $unwind
将数组类型字段拆分为单独的文档。
例如,如果有一个posts数组字段,每个文档包含用户发表的多篇帖子,可以使用$unwind操作将posts拆分为单独的帖子文档:
db.users.aggregate([
{"$unwind": "$posts"}
])
2.7 $project
用于修改输入文档的结构。可以用来重命名、增加或删除字段。
例如,删除_id字段,重命名count为数量:
db.users.aggregate([
{"$group": {"_id": "$gender", "count": {"$sum": 1}}},
{"$project": {"_id": 0, "数量": "$count"}}
])
2.8 $addFields
用于向文档添加新字段。
例如,将count字段增加100,然后重命名为total:
db.users.aggregate([
{"$group": {"_id": "$gender", "count": {"$sum": 1}}},
{"$addFields": {"total": {"$add": ["$count", 100]}}},
{"$project": {"_id": 0, "total": 1}}
])
2.9 执行聚合查询
可以通过db.col.aggregate()执行聚合查询。
例如:
db.users.aggregate([
{"$group": {"_id": "$gender", "count": {"$sum": 1}}}
])
可以使用pretty()方法以易读的方式查看聚合查询结果。
例如:
db.users.aggregate([
{"$group": {"_id": "$gender", "count": {"$sum": 1}}}
]).pretty()
这里包含了比较常用的mongodb的操作了,其余的可以看官方文档或者私聊我本人进行补充。
上一章: 二、MongoDB简介及基本操作
下一章: 四、Springboot连接mongodb
相关文章:
三、mongdb 查询
一、 MongoDB文档检索 MongoDB中有多种方式可以检索文档: 1.1 查询过滤器 使用查询过滤器从集合中检索文档。查询过滤器是一组键值对,可按字段值查询文档。 例如: db.col.find({"status":"A"})这个示例查询status等于“A”的文档。 1.2 范围查询操作符…...
python的 ping 网络状态监测方法(含多IP)
ping 基本概念 ping (Packet Internet Groper)是一种因特网包探索器,用于测试网络连接量的程序。Ping是工作在 TCP/IP网络体系结构中应用层的一个服务命令, 主要是向特定的目的主机发送 ICMP(Internet Control Messag…...
【独家】华为OD机试提供C语言题解 - 单词反转
最近更新的博客 华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南)华为od机试,独家整理 已参加机试人员的实战技巧文章目录 最近更新的博客使用说明单词…...
Linux docker环境安装,docker-compose安装,jdk17安装
安装docker 删除之前安装的docker yum remove docker \docker-client \docker-client-latest \docker- common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-sqlinux \docker-engine-selinux \docker-engine \docker-ce安装yum工具 yum install -y y…...
界面开发(3)--- PyQt5用户登录界面连接数据库
文章目录数据库账户注册账号登录找回密码为了实现用户登录界面的登录功能,我们必须建立一个数据库,并把账号和对应的密码,存储到数据库中。如果输入的账号和密码与数据库中的一致,那我们就允许用户登录,进入新的界面。…...
以下真的没有任何要写的了,我需要凑字数,请大家原谅
以下真的没有任何要写的了,我需要凑字数,请大家原谅!!!!!!!!!!!!!!!&#…...
2023年 Java 发展趋势
GitHub 语言统计表明,Java在编程语言中排名第二,而在2022年的TIOBE指数中,Java排在第四。 抛开排名,Java是自诞生以来企业使用率最高的编程语言,作为一种编程语言,它比许多竞争对手都有更多的优点…...
Lsof命令介绍
LSOF(List Open Files)是一款功能强大的开源工具,用于列出当前系统上打开的文件和进程。该工具可以帮助系统管理员和开发人员快速查找正在使用某个文件的进程,以及在系统上使用磁盘空间最多的进程。 本文将介绍LSOF的基本用法和常…...
LeetCode题目笔记——1487. 保证文件名唯一
文章目录题目描述题目链接题目难度——中等方法一:哈希表代码/Python代码/C总结题目描述 给你一个长度为 n 的字符串数组 names 。你将会在文件系统中创建 n 个文件夹:在第 i 分钟,新建名为 names[i] 的文件夹。 由于两个文件 不能 共享相同…...
【概念辨析】结构体内存对齐
一、什么是结构体内存对齐 是使得结构体的每个成员能够在及其访问的特定存储单元上的一种方法。 通过这种方法可以使得机器访问效率加快,也可以使得平台一致性变高。 二、结构体对齐的规则 有两组代码: #define _CRT_SECURE_NO_WARNINGS#include <…...
pg mysql oracle 中的schema
1、schema。 pg中的schema表示当前db中数据库对象的命名空间(namespace),数据库对象包括但不限于表、函数、视图、索引等。 对于熟悉mysql的人来说,在第一次看到pg中的schema的概念时,可能会疑惑,schema不是表示database的吗&…...
电脑快捷方式删除文件后四种找回方法
快捷指令是一种用作替代快捷键操作的技术。也可以称为“快捷键”,“快捷方式”或“快捷键序列”,它们允许用户在非常快速和方便的方式建立特定操作序列,这对于执行重复性或提高效率非常有用。通过使用快捷指令,您可以执行快速复制…...
Session会话管理
会话管理Web会话管理概述常见的Web应用会话管理方式基于Server端的Session的管理方式基于Cookie的Session的管理方式Cookie与Session最大的区别Cookie-Based的管理方式基于Token-Based的管理方式Web会话管理的安全问题Web会话管理概述 会话管理:在进行人机交互的时…...
极智开发 | ubuntu源码编译cuda版opencv
欢迎关注我的公众号 [极智视界],获取我的更多经验分享 大家好,我是极智视界,本文介绍一下 ubuntu源码编译cuda版opencv。 邀您加入我的知识星球「极智视界」,星球内有超多好玩的项目实战源码下载,链接:https://t.zsxq.com/0aiNxERDq 如果你需要源码编译cpu版的opencv可以…...
umi学习(umi4)
umi 官方文档 官方建议使用 pnpm node版本在 14 以上 创建项目: 根据 包管理工具不同 ,官方推荐 这里使用 pnpm: 1. pnpm dlx create-umilatest 2. 选择模板 (这里使用 Simple App) 想对module处理需要使用 Ant Desig…...
EasyPoi的excel模板预览与下载、导出简单/复杂数据
官方文档地址:easypoi官网,官方仅供参考,部分描述有问题 excel模板预览 准备工作 事先将整理好的excel模板存在项目中,如图 excel模板预览代码 GetMapping("excel")ApiOperation("excel预览")NoLogpubli…...
收个滴滴Offer:从小伙三面经历,看看需要学点啥?
说在前面 在尼恩的(50)读者社群中,经常有小伙伴,需要面试大厂。 后续结合一些大厂的面试真题,给大家梳理一下学习路径,看看大家需要学点啥? 这里也一并把题目以及参考答案,收入咱…...
Spark Shuffle解析
1 Shuffle的核心要点 1.1 ShuffleMapStage与ResultStage ShuffleMapStage与ResultStage 在划分stage时,最后一个stage称为finalStage,它本质上是一个ResultStage对象,前面的所有stage被称为ShuffleMapStage。 ShuffleMapStage的结束伴随着…...
Qt 解决程序全屏运行弹窗引发任务栏显示
文章目录摘要在VM虚拟机器中测试setWindowFlags()关键字: Qt、 Qt::WindowStayOnTopHint、 setWindowFlags、 Qt::Window、 Qt::Tool摘要 今天眼看项目就要交付了,结果在测试程序的时候,发现在程序全品情况下,点击输入框&#x…...
【进阶】2、搭建K8s集群【v1.23】
[toc] 一、安装要求 在开始之前,部署Kubernetes集群机器需要满足以下几个条件: 一台或多台机器,操作系统 CentOS7.x-86_x64硬件配置:2GB或更多RAM,2个CPU或更多CPU,硬盘30GB或更多集群中所有机器之间网络…...
DBAPI如何优雅的获取单条数据
API如何优雅的获取单条数据 案例一 对于查询类API,查询的是单条数据,比如根据主键ID查询用户信息,sql如下: select id, name, age from user where id #{id}API默认返回的数据格式是多条的,如下: {&qu…...
Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)
目录 一、👋🏻前言 二、😈sinx波动的基本原理 三、😈波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、🌊波动优化…...
Java求职者面试指南:计算机基础与源码原理深度解析
Java求职者面试指南:计算机基础与源码原理深度解析 第一轮提问:基础概念问题 1. 请解释什么是进程和线程的区别? 面试官:进程是程序的一次执行过程,是系统进行资源分配和调度的基本单位;而线程是进程中的…...
C++课设:简易日历程序(支持传统节假日 + 二十四节气 + 个人纪念日管理)
名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《编程项目实战》 目录 一、为什么要开发一个日历程序?1. 深入理解时间算法2. 练习面向对象设计3. 学习数据结构应用二、核心算法深度解析…...
代码规范和架构【立芯理论一】(2025.06.08)
1、代码规范的目标 代码简洁精炼、美观,可持续性好高效率高复用,可移植性好高内聚,低耦合没有冗余规范性,代码有规可循,可以看出自己当时的思考过程特殊排版,特殊语法,特殊指令,必须…...
消防一体化安全管控平台:构建消防“一张图”和APP统一管理
在城市的某个角落,一场突如其来的火灾打破了平静。熊熊烈火迅速蔓延,滚滚浓烟弥漫开来,周围群众的生命财产安全受到严重威胁。就在这千钧一发之际,消防救援队伍迅速行动,而豪越科技消防一体化安全管控平台构建的消防“…...
【Linux】Linux安装并配置RabbitMQ
目录 1. 安装 Erlang 2. 安装 RabbitMQ 2.1.添加 RabbitMQ 仓库 2.2.安装 RabbitMQ 3.配置 3.1.启动和管理服务 4. 访问管理界面 5.安装问题 6.修改密码 7.修改端口 7.1.找到文件 7.2.修改文件 1. 安装 Erlang 由于 RabbitMQ 是用 Erlang 编写的,需要先安…...
未授权访问事件频发,我们应当如何应对?
在当下,数据已成为企业和组织的核心资产,是推动业务发展、决策制定以及创新的关键驱动力。然而,未授权访问这一隐匿的安全威胁,正如同高悬的达摩克利斯之剑,时刻威胁着数据的安全,一旦触发,便可…...
mcts蒙特卡洛模拟树思想
您这个观察非常敏锐,而且在很大程度上是正确的!您已经洞察到了MCTS算法在不同阶段的两种不同行为模式。我们来把这个关系理得更清楚一些,您的理解其实离真相只有一步之遥。 您说的“select是在二次选择的时候起作用”,这个观察非…...
uni-app学习笔记二十三--交互反馈showToast用法
showToast部分文档位于uniapp官网-->API-->界面:uni.showToast(OBJECT) | uni-app官网 uni.showToast(OBJECT) 用于显示消息提示框 OBJECT参数说明 参数类型必填说明平台差异说明titleString是提示的内容,长度与 icon 取值有关。iconString否图…...
