MongoDB 作为文档型数据库,其查询语言基于 BSON(二进制 JSON)格式,与传统关系型数据库的 SQL 语法有较大差异。

一、基本查询命令

1. find():查询文档

  • 语法db.collection.find(查询条件, 投影)
  • 示例
    // 查询users集合中所有文档
    db.users.find()// 查询年龄大于25岁的用户,只返回姓名和年龄
    db.users.find({ age: { $gt: 25 } }, { name: 1, age: 1 })
    

2. findOne():查询单个文档

  • 语法db.collection.findOne(查询条件, 投影)
  • 示例
    // 查询ID为1001的用户
    db.users.findOne({ id: 1001 })
    

3. countDocuments():统计文档数量

  • 语法db.collection.countDocuments(查询条件)
  • 示例
    // 统计年龄大于30岁的用户数量
    db.users.countDocuments({ age: { $gt: 30 } })
    

二、查询条件操作符

1. 比较操作符

操作符含义示例
$eq等于{ age: { $eq: 30 } }
$gt大于{ age: { $gt: 30 } }
$lt小于{ age: { $lt: 30 } }
$gte大于等于{ age: { $gte: 30 } }
$lte小于等于{ age: { $lte: 30 } }
$ne不等于{ age: { $ne: 30 } }
$in包含于数组{ age: { $in: [25, 30, 35] } }
$nin不包含于数组{ age: { $nin: [25, 30, 35] } }

2. 逻辑操作符

  • $and:多条件同时满足
    db.users.find({ $and: [{ age: { $gt: 25 } }, { gender: "male" }] })
    
  • $or:多条件满足其一
    db.users.find({ $or: [{ age: { $gt: 40 } }, { profession: "engineer" }] })
    
  • $not:取反条件
    db.users.find({ age: { $not: { $gt: 30 } } })  // 年龄≤30
    

3. 文本与正则操作符

  • $regex:正则匹配
    db.users.find({ name: { $regex: "^John" } })  // 姓名以John开头
    
  • $text:全文搜索(需先创建文本索引)
    db.users.find({ $text: { $search: "John" } })
    

三、查询结果处理

1. 排序:sort()

  • 语法db.collection.find().sort({ 字段: 1/-1 })
  • 示例
    // 按年龄升序排列
    db.users.find().sort({ age: 1 })// 按年龄降序、姓名升序排列
    db.users.find().sort({ age: -1, name: 1 })
    

2. 限制结果:limit()

  • 语法db.collection.find().limit(数量)
  • 示例
    // 只返回前10条记录
    db.users.find().limit(10)
    

3. 跳过结果:skip()

  • 语法db.collection.find().skip(数量)
  • 示例
    // 跳过前5条,返回接下来的10条(分页查询)
    db.users.find().skip(5).limit(10)
    

四、聚合查询:aggregate()

聚合操作通过管道(Pipeline)处理文档,常用阶段包括:

1. $match:过滤文档

db.sales.aggregate([{ $match: { amount: { $gt: 1000 } } }  // 筛选金额>1000的记录
])

2. $group:分组统计

db.sales.aggregate([{ $group: {_id: "$category",  // 按类别分组totalAmount: { $sum: "$amount" },  // 计算每组总金额count: { $sum: 1 }  // 计算每组文档数}}
])

3. $project:投影字段

db.sales.aggregate([{ $project: {category: 1,amount: 1,isBigOrder: { $gt: ["$amount", 5000] }  // 新增字段标识大额订单}}
])

4. $sort/$limit/$skip:同查询结果处理

db.sales.aggregate([{ $sort: { amount: -1 } },  // 按金额降序{ $limit: 10 }  // 取前10条
])

五、索引管理命令

1. 创建索引

  • 单字段索引
    db.users.createIndex({ age: 1 })  // 升序索引
    db.users.createIndex({ name: -1 })  // 降序索引
    
  • 复合索引
    db.sales.createIndex({ category: 1, amount: -1 })
    
  • 唯一索引
    db.users.createIndex({ email: 1 }, { unique: true })
    

2. 查看索引

db.users.getIndexes()

3. 删除索引

db.users.dropIndex("age_1")  // 删除指定索引
db.users.dropIndexes()  // 删除所有索引

六、高级查询技巧

1. 数组查询

  • 匹配数组中的元素:
    db.users.find({ hobbies: "reading" })  // 包含reading的用户
    
  • 匹配数组中满足条件的元素:
    db.users.find({ "scores.math": { $gt: 80 } })  // 数学成绩>80
    
  • 数组大小匹配:
    db.users.find({ hobbies: { $size: 3 } })  // 恰好有3个爱好
    

2. 嵌套文档查询

db.users.find({ "address.city": "Beijing" })  // 地址在北京市的用户

七、查询优化命令

1. 解释查询计划

db.users.find({ age: { $gt: 30 } }).explain("executionStats")

2. 统计索引使用情况

db.users.totalIndexSize()  // 查看索引总大小
db.runCommand({ indexStats: "users" })  // 查看详细索引统计

八、SQL 与 MongoDB 查询语法对比

SQL 语法MongoDB 语法
SELECT * FROM usersdb.users.find()
SELECT * FROM users WHERE age > 25db.users.find({ age: { $gt: 25 } })
SELECT * FROM users ORDER BY age DESC LIMIT 10db.users.find().sort({ age: -1 }).limit(10)
SELECT category, SUM(amount) FROM sales GROUP BY categorydb.sales.aggregate([{ $group: { _id: "$category", total: { $sum: "$amount" } }]

通过以上常用查询命令,可满足 MongoDB 中绝大多数查询需求。实际应用中,建议结合索引优化和查询计划分析,以提升大数据量下的查询性能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/86863.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/86863.shtml
英文地址,请注明出处:http://en.pswp.cn/web/86863.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AlpineLinux安装docker

或许你在docker中使用 Alpine Linux 的镜像使用得多,但是有没有想过在 Alpine Linux 上安装 Docker 来使用呢?默认情况下,Docker 包位于社区仓库中,因此在使用包管理来安装docker之前建议更换为国内源,并开启社区仓库的链接。 下面的操作是在root用户下运行的,如果要使用…

docker安装gitlab并配置ssl证书

本篇安装环境 Docker版本:Docker version 28.3.0 域名:test.disallow.cn 自签证书:/etc/gitlab/ssl(已经存放在该目录) 一、拉取镜像 docker run -itd \--privilegedtrue \--hostname gitlab.test.disallow.cn \--p…

Java开发者转型AI时代的路径

Java开发者转型AI时代的路径 引言 随着人工智能技术的飞速发展,AI已不再是遥不可及的未来,而是深刻影响着各行各业的当下。对于Java开发者而言,面对AI浪潮,如何顺势而为,实现职业转型与技能升级,成为摆在…

QT6 源(140)模型视图架构里的视图总基类 QAbstractItemView:

(1)先给出本类的继承关系 : (2)Qt 已经预先为视图定义了键盘功能,Qt 大师们通过编程,已经完善了视图对键盘的响应操作 : (3)因为本类是抽象基类,无…

vue上传各种文件,并预览组件,(预览,下载),下载resources目录下文件

前端组件vue 最终效果 <template><div ><div class"file-list" v-if"existingFiles.length > 0"><div class"file-card" v-for"(file, index) in existingFiles" :key"file.id"><div clas…

【CS创世SD NAND征文】SD NAND赋能新一代儿童智能玩具

基于全志F1C100S的高可靠存储方案 文章目录 基于全志F1C100S的高可靠存储方案[toc]前言 一、应用产品介绍&#xff1a;儿童智能玩具的需求演变二、技术方案介绍&#xff1a;构建智能玩具的"大脑"与"记忆库"三、核心技术模块分析3.1 主控芯片&#xff1a;全…

mac触摸板设置右键

在 Mac 笔记本上&#xff0c;触摸板默认没有物理左右键分区&#xff0c;但可以通过以下方式实现“右键”功能&#xff08;称为 辅助点按&#xff09;&#xff1a; 一、启用与使用右键&#xff08;辅助点按&#xff09; 步骤1&#xff1a;检查系统设置 点击屏幕左上角 &#x…

稳定币发行量创纪录地超过 Visa 交易量

稳定币发行量创纪录地超过 Visa 交易量 稳定币的崛起正在重塑全球金融格局&#xff0c;华夏基金首席执行官甘天&#xff08;Gan Tian&#xff09;强调了稳定币的快速增长&#xff0c;并指出稳定币的交易量在短短五年内就超过了Visa 40年的交易量。这凸显了货币使用的转变。 稳…

编程 IDE 混战简史:从 Copilot 到 Claude Code,一场重塑开发方式的战争

unsetunset引言&#xff1a;开发新纪元的序幕unsetunset 编程世界&#xff0c;从最初依赖打孔卡和简陋的命令行工具&#xff0c;到如今功能琳琅满目的集成开发环境&#xff08;IDE&#xff09;&#xff0c;每一步都见证了效率与智能的飞跃。IDE作为开发者与代码交互的核心界面&…

软测八股--计算机网络

计算机网络基础 局域网广域网 局域网&#xff1a;一个区域内由多台计算机互联成的计算机组&#xff08;学校&#xff0c;办公室&#xff0c;公司/学校等&#xff09;。可以实现文件管理&#xff0c;应用软件管理&#xff0c;答应及管理&#xff0c;扫描仪共享等。是封闭的&am…

某省职业院校技能大赛 高职组“信息安全管理与评估”赛项第二部分:应急响应

&#xff01;&#xff01;&#xff01;需要环境可私信博主&#xff01;&#xff01;&#xff01; &#xff01;&#xff01;&#xff01;若有错误欢迎指正&#xff01;:) 序号任务要求1提交攻击者的两个内网IP地址2提交网站管理员用户的用户名和密码3提交黑客得到 mysql 服务的…

OkHttp 简单配置

OkHttpClient 的简单配置&#xff0c;包含重试&#xff0c;线程池 Configuration public class OkHttpConfig {Bean("deSourceOkHttp")public OkHttpClient okHttpClient() {return new OkHttpClient.Builder().connectTimeout(60, TimeUnit.SECONDS).readTimeout(3…

群晖nas安装moodle跳坑记录

1&#xff0c;套件里面直接安装 会安装好几个依赖&#xff0c;包括php apach &#xff0c;数据库。这些安装的时间就比较长。 安装完成后自动安装 Moodle。 过程也很长数据库里面的表有接近500张。 2&#xff0c;安装位置 顺便提一下 nas程序的安装位置 这两个位置好像都不是…

鸿蒙HarmonyOS 5小游戏实践:打砖块游戏(附:源代码)

打砖块是一款经典的游戏&#xff0c;它简单易懂却又充满挑战性。本文将介绍如何使用ArkUI框架开发一个完整的打砖块游戏&#xff0c;涵盖游戏逻辑设计、UI实现和交互处理等核心内容。 游戏架构设计 我们的打砖块游戏采用了组件化设计&#xff0c;主要分为两个部分&#xff1a;…

Flutter MobX 响应式原理与实战详解

&#x1f4da; Flutter 状态管理系列文章目录 Flutter 状态管理(setState、InheritedWidget、 Provider 、Riverpod、 BLoC / Cubit、 GetX 、MobX 、Redux) setState() 使用详解&#xff1a;原理及注意事项 InheritedWidget 组件使用及原理 Flutter 中 Provider 的使用、注…

浅谈国产数据库多租户方案:提升云计算与SaaS的资源管理效率

近年来&#xff0c;“数据库多租户”这一概念在技术圈内频频出现&#xff0c;成为云计算和SaaS&#xff08;软件即服务&#xff09;架构中的重要组成部分。多租户架构不仅为企业提供了高效的资源隔离与共享解决方案&#xff0c;还能大幅降低成本&#xff0c;提高系统的可扩展性…

Wpf的Binding

前言 wpf的Binding就像一个桥梁&#xff0c;它的作用就是连接逻辑层与界面层&#xff0c;既能够把逻辑层的数据搬到界面层展示&#xff0c;又能将界面层的数据更改后传递到逻辑层&#xff0c;Binding的数据来源就是Binding的源&#xff0c;数据展示的地方就是Binding的目标。 …

嵌入式单片机中SPI串行外设接口控制与详解

串行外设接口(Serial Peripheral Interface)的简称也叫做SPI,是一种高速的、全双工同步通信的一种接口,串行外设接口一般是需要4根线来进行通信(NSS、MISO、MOSI、SCK),但是如果打算实现单向通信(最少3根线),就可以利用这种机制实现一对多或者一对一的通信。 第一:…

【世纪龙科技】新能源汽车动力电池总成装调与检修教学软件

在新能源汽车产业“技术迭代快、安全要求高、实操风险大”的背景下&#xff0c;职业院校如何以“项目式教学改革”为突破口&#xff0c;破解传统实训“高成本、高风险、低效率”的困局&#xff1f;江苏世纪龙科技以桌面VR沉浸式技术为支点&#xff0c;推出《新能源动力电池总成…

GO泛型编程面试题及参考答案

目录 什么是 Go 中的泛型?Go 从哪个版本开始支持泛型? 在 Go 中如何定义一个带类型参数的函数? 如何为结构体添加类型参数? 使用 any 关键字和自定义类型约束有什么区别? 泛型中~T 的语义及其实际应用是什么? 如何在函数中使用多个类型参数?举例说明。 Go 泛型支…