MongoDB 的增删改查(CRUD)操作是其核心功能,主要通过 mongo shell 或驱动(如 Node.js、Python 等)实现。以下是最常用操作的详细说明及示例(基于 mongo shell 语法)。

一、插入操作(Insert)​

用于向集合中添加文档,支持插入单条或多条数据。

​**1. 插入单条文档:insertOne()**​

向集合中插入一个文档,返回操作结果(包含是否成功、插入的 _id 等信息)。

语法​:

db.collection.insertOne({<field1>: <value1>,<field2>: <value2>,...
})

示例​:
users 集合插入一条用户记录:

// 若集合不存在,MongoDB 会自动创建
db.users.insertOne({name: "Alice",age: 25,email: "alice@example.com",hobbies: ["reading", "hiking"],isStudent: false
})

输出结果​:

{"acknowledged": true,    // 操作是否被服务端确认(默认开启写确认)"insertedId": ObjectId("650a8b9d0f7d0e1a2c3b4d5e")  // 自动生成的唯一 _id
}
​**2. 插入多条文档:insertMany()**​

向集合中批量插入多个文档,适合初始化数据或批量导入。

语法​:

db.collection.insertMany([{ <doc1> },{ <doc2> },...
])

示例​:
插入 3 条用户记录:

db.users.insertMany([{name: "Bob",age: 30,email: "bob@example.com",hobbies: ["gaming", "coding"]},{name: "Charlie",age: 22,email: "charlie@example.com",isStudent: true},{name: "Diana",age: 28,email: "diana@example.com",hobbies: ["painting"],isStudent: false}
])

输出结果​:

{"acknowledged": true,"insertedIds": [ObjectId("650a8ba90f7d0e1a2c3b4d5f"),ObjectId("650a8ba90f7d0e1a2c3b4d60"),ObjectId("650a8ba90f7d0e1a2c3b4d61")]
}

二、查询操作(Query)​

用于从集合中检索符合条件的文档,核心方法是 find()findOne()

​**1. 基础查询:find()**​

返回所有符合条件的文档(默认返回所有字段),支持条件过滤、投影(指定返回字段)、排序、分页等。

语法​:

db.collection.find(<query>, <projection>)
  • <query>:查询条件(类似 SQL 的 WHERE 子句)。
  • <projection>:可选,指定返回的字段(1 表示包含,0 表示排除,不能混合使用 _id 与其他字段外的 10)。

示例​:

​(1) 无过滤查询(返回所有文档)​
db.users.find()  // 返回 users 集合的所有文档
​(2) 条件查询(过滤文档)​

使用 ​查询操作符​(如 $eq$gt$lt$in 等)定义条件。

  • 示例 1:精确匹配​($eq
    查询 name 为 "Alice" 的文档:

    db.users.find({ name: { $eq: "Alice" } })
    // 等价于简写:db.users.find({ name: "Alice" })
  • 示例 2:范围查询​($gt 大于,$lt 小于)
    查询年龄大于 25 岁的用户:

    db.users.find({ age: { $gt: 25 } })
  • 示例 3:包含查询​($in 匹配数组中的任意值)
    查询邮箱在 ["alice@example.com", "diana@example.com"] 中的用户:

    db.users.find({ email: { $in: ["alice@example.com", "diana@example.com"] } })
  • 示例 4:嵌套字段查询​(点符号 . 访问嵌套字段)
    假设文档有嵌套结构(如 address.city):

    // 插入一条带嵌套字段的文档:
    db.users.insertOne({name: "Eve",address: { city: "Beijing", zip: "100000" }
    })// 查询城市为 Beijing 的用户:
    db.users.find({ "address.city": "Beijing" })
  • 示例 5:正则表达式查询​($regex
    查询 name 以 "A" 开头的用户:

    db.users.find({ name: { $regex: "^A" } })  // 输出 Alice(假设存在)
2. 投影(Projection)​

控制返回的字段,减少网络传输量。

语法​:

db.collection.find(<query>, { <field1>: 1, <field2>: 0 })
  • _id 字段默认返回,若需排除需显式设置 "_id": 0

示例​:
查询所有用户,但只返回 nameemail 字段:

db.users.find({}, { name: 1, email: 1, _id: 0 })

输出结果​:

{ "name" : "Alice", "email" : "alice@example.com" }
{ "name" : "Bob", "email" : "bob@example.com" }
...
3. 排序、分页与统计
  • 排序​:使用 sort() 方法(1 升序,-1 降序)。
    示例:按年龄升序排序:

    db.users.find().sort({ age: 1 })
  • 分页​:使用 skip(n)(跳过前 n 条)和 limit(m)(限制返回 m 条)。
    示例:查询第 2 页(每页 2 条):

    db.users.find().skip(2).limit(2)  // 跳过前 2 条,取 2 条
  • 统计数量​:使用 countDocuments()(统计符合条件的文档数)。
    示例:统计年龄大于 25 岁的用户数量:

    db.users.countDocuments({ age: { $gt: 25 } })
​**4. 单条文档查询:findOne()**​

返回符合条件的第一条文档​(适合快速获取单条数据)。

语法​:

db.collection.findOne(<query>, <projection>)

示例​:
查询 name 为 "Bob" 的第一条文档:

db.users.findOne({ name: "Bob" })

三、更新操作(Update)​

用于修改集合中的文档,支持部分更新(仅修改指定字段)或全量替换。核心方法是 updateOne()updateMany()replaceOne()

​**1. 更新单条文档:updateOne()**​

更新第一条符合条件的文档,返回操作结果(包含是否成功、修改的文档数等)。

语法​:

db.collection.updateOne(<query>,          // 查询条件(匹配要更新的文档)<update>,         // 更新操作(使用更新操作符)<options>         // 可选参数(如 upsert: true 表示不存在则插入)
)

关键更新操作符​(必须配合使用,否则会覆盖整个文档):

  • $set:设置字段的值(若字段不存在则创建)。
  • $inc:对数值型字段递增/递减。
  • $push:向数组字段末尾添加元素。
  • $pull:从数组字段中移除指定元素。
  • $unset:删除指定字段。

示例​:

​(1) 使用 $set 修改字段

name 为 "Alice" 的用户的 email 修改为 "alice.new@example.com":

db.users.updateOne({ name: "Alice" },{ $set: { email: "alice.new@example.com" } }
)

输出结果​:

{"acknowledged": true,"matchedCount": 1,    // 匹配到的文档数"modifiedCount": 1    // 实际修改的文档数(若字段未变化则为 0)
}
​(2) 使用 $inc 递增数值

name 为 "Bob" 的用户的 age 加 1:

db.users.updateOne({ name: "Bob" },{ $inc: { age: 1 } }
)
​(3) 使用 $push 向数组添加元素

name 为 "Charlie" 的用户的 hobbies 数组添加 "swimming":

db.users.updateOne({ name: "Charlie" },{ $push: { hobbies: "swimming" } }
)
​(4) 使用 $unset 删除字段

删除 name 为 "Diana" 的用户的 isStudent 字段:

db.users.updateOne({ name: "Diana" },{ $unset: { isStudent: "" } }  // 值可以是任意(通常用空字符串)
)
​**2. 更新多条文档:updateMany()**​

更新所有符合条件的文档(与 updateOne() 仅匹配数量不同)。

示例​:
将所有年龄小于 28 岁的用户的 isStudent 字段设为 true

db.users.updateMany({ age: { $lt: 28 } },{ $set: { isStudent: true } }
)
​**3. 全量替换文档:replaceOne()**​

用新文档完全替换匹配到的第一条文档(原字段会被覆盖,仅保留 _id)。

语法​:

db.collection.replaceOne(<query>,    // 查询条件<replacementDoc>  // 替换的新文档(不能包含操作符如 $set)
)

示例​:
name 为 "Eve" 的用户替换为新文档(仅保留 _id):

db.users.replaceOne({ name: "Eve" },{newName: "Eve Smith",  // 原 name 字段被覆盖age: 30,email: "eve.smith@example.com"}
)

四、删除操作(Delete)​

用于删除集合中的文档,核心方法是 deleteOne()deleteMany()

​**1. 删除单条文档:deleteOne()**​

删除第一条符合条件的文档。

语法​:

db.collection.deleteOne(<query>)

示例​:
删除 name 为 "Charlie" 的第一条文档:

db.users.deleteOne({ name: "Charlie" })

输出结果​:

{"acknowledged": true,"deletedCount": 1  // 实际删除的文档数
}
​**2. 删除多条文档:deleteMany()**​

删除所有符合条件的文档。

示例​:
删除所有年龄大于 30 岁的用户:

db.users.deleteMany({ age: { $gt: 30 } })
注意​:
  • 删除操作不可逆,建议先使用 find() 确认匹配的文档,再执行删除。
  • 若需清空集合,可使用 db.collection.deleteMany({})(谨慎!)。

五、聚合查询(Aggregate)​

用于复杂数据处理(如分组、统计、关联等),通过聚合管道​(多个阶段依次处理)实现。

核心阶段(Stage)​
  • $match:过滤文档(类似 find())。
  • $group:按指定字段分组,计算聚合值(如求和、计数)。
  • $project:投影(指定输出字段)。
  • $sort:排序。
  • $limit:限制输出数量。
示例:统计各城市的用户数量

需求:按 address.city 分组,统计每个城市的用户数。

聚合管道​:

db.users.aggregate([{ $match: { "address.city": { $exists: true } } },  // 过滤有城市的文档{ $group: {                                         // 分组统计_id: "$address.city",                             // 分组依据(城市名)count: { $sum: 1 }                                // 每组计数 +1}},{ $sort: { count: -1 } }                            // 按数量降序排序
])

输出结果​(假设):

[{ "_id" : "Beijing", "count" : 2 },{ "_id" : "Shanghai", "count" : 1 }
]

总结

MongoDB 的 CRUD 操作围绕文档的增删改查展开,核心方法包括:

  • 插入​:insertOne()insertMany()
  • 查询​:find()(含投影、排序、分页)、findOne()
  • 更新​:updateOne()(部分更新)、updateMany()(批量更新)、replaceOne()(全量替换)
  • 删除​:deleteOne()deleteMany()
  • 高级查询​:聚合管道(aggregate())处理复杂统计。

实际使用中,需根据业务需求选择合适的操作方法,并注意索引优化(如为常用查询字段创建索引)以提升性能。

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

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

相关文章

moodle升级(4.5到5.0)

升级目标 由Moodle 4.5 (Build: 20241129) 升级到Moodle 5.0.1 (Build: 20250629) 参考教程&#xff1a;moodle升级&#xff08;详细版&#xff09;-CSDN博客 操作平台&#xff1a;宝塔 通过宝塔进行备份 备份文件 将/www/wwwroot/moodle 和/www/wwwroot/moodledata 复制…

基于Apache POI实现百度POI分类快速导入PostgreSQL数据库实战

## 引言:POI数据的价值与挑战 POI(Point of Interest)数据作为地理信息系统的核心要素,在智慧城市、位置服务、商业分析等领域具有重要价值。百度POI数据包含了丰富的地点信息(如名称、类别、坐标等),但如何高效处理这些数据并将其导入数据库进行分析是开发者面临的挑战…

linux LAMP 3

[rootcode apache2]# bin/apachectl AH00558: httpd: Could not reliably determine the server’s fully qualified domain name, using fe80::20c:29ff:fe2a:708a. Set the ‘ServerName’ directive globally to suppress this message root192.168.235.5s password:┌─…

UI自动化-Selenium WebDriver

前言 Selenium WebDriver 是 Selenium 项目中最核心、最强大的组件&#xff0c;它是一个用于自动化控制网页浏览器的开源 API&#xff08;应用程序编程接口&#xff09;。 简单来说&#xff0c;Selenium WebDriver 就是一个允许你用编程语言&#xff08;如 Java、Python、C#、…

具身多模态大模型在感知与交互方面的综述

引言在本学期方老师的《机器人与大模型》课上&#xff0c;我首次接触到了关于具身智能的前沿知识&#xff0c;尤其作为课上交互组的成员&#xff0c;从表情识别到语音交互到机械狗的开发实践进行了一些有意思的探索&#xff0c;使我在其中感受到了具身智能的巨大魅力和无限潜力…

UI 设计|审美积累 | 拟物化风格(Skeuomorphism)

拟物化是指把现实世界的材质、光影和结构带到数字界面中。木纹、金属、皮革、纸张等真实物体的质感&#xff0c;被细致地还原到屏幕上&#xff0c;让用户一眼就明白元素的意义与操作方式。它曾是iOS6之前移动端设计的主流风格&#xff0c;也一度被极简风格取代&#xff0c;但在…

EventBridge精准之道:CloudTrail事件 vs. 服务原生事件,我该如何选?

当我们深入使用AWS EventBridge时&#xff0c;常常会发现一个有趣的现象&#xff1a;对于同一个操作&#xff08;比如启动一个EC2实例&#xff09;&#xff0c;EventBridge中似乎会出现两种事件。一种来自CloudTrail&#xff0c;记录了API调用的行为&#xff1b;另一种则直接来…

【算法】动态规划 斐波那契类型: 740. 删除并获得点数

740. 删除并获得点数 中等 题目 给你一个整数数组 nums &#xff0c;你可以对它进行一些操作。 每次操作中&#xff0c;选择任意一个 nums[i] &#xff0c;删除它并获得 nums[i] 的点数。之后&#xff0c;你必须删除 所有 等于 nums[i] - 1 和 nums[i] 1 的元素。 开始你…

AWS MySQL 读写分离配置指南

# AWS JDBC Wrapper读写分离配置实战&#xff1a;Spring Boot MyBatis Plus完整解决方案 ## 前言 在微服务架构中&#xff0c;数据库读写分离是提升系统性能的重要手段。本文将详细介绍如何在Spring Boot项目中使用AWS JDBC Wrapper实现自动读写分离&#xff0c;重点解决MyBat…

opencv检测运动物体

检测到的所有移动物体中轮廓中找到面积最大的轮廓&#xff0c;并绘制这个轮廓的矩形框。 #include <opencv2/opencv.hpp> #include <iostream>int main() {// 打开视频文件或摄像头cv::VideoCapture capture;capture.open("move3.mp4"); // 打开视频文件…

Camera相机人脸识别系列专题分析之十五:人脸特征检测FFD算法之libcvface_api.so算法API详细注释解析

【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了: 这一篇我们开始讲: Camera相机人脸识别系列专题分析之十五:人脸特征检测FFD算法之libcvface_api.so算法API详细注释解析 目录 一、libcvface_api.so算法API详细注释解析

图像擦除论文-2:SmartEraser、Erase Diffusion、OmniEraser

图像生成模型应用系列——图像擦除&#xff1a; 图像擦除论文-1&#xff1a;PixelHacker、PowerPanint等 图像擦除论文-2&#xff1a;擦除类型数据集构建(1) Erase Diffusion Erase Diffusion: Empowering Object Removal Through Calibrating Diffusion Pathways https://git…

九识无人车陕西运营中心展厅启幕 打造智能城配物流新标杆

7月1日&#xff0c;九识无人车陕西运营中心展厅正式开业&#xff0c;全国业务版图再添重要一子。这座展厅是九识在陕西省的首家展厅&#xff0c;由九识第一位正式提车的客户、首位代理商伙伴孙朋奇先生打造。展厅集产品展示与技术体验于一体&#xff0c;成为西北地区城配领域自…

AI智能体|扣子(Coze)搭建【沉浸式历史故事解说视频】工作流

主包讲解历史对我们的好处&#xff0c;纯个人观点&#xff01; 这个世界是存在一些规律的&#xff0c;很多东西并不能够通过自己的聪明去创新&#xff0c;去改变的。 无论你怎么样创新&#xff0c;你都会回到哪个规律中去&#xff0c;比如很多人做一些商业模式的创新&#xff0…

Softhub软件下载站实战开发(十):实现图片视频上传下载接口

文章目录 Softhub软件下载站实战开发&#xff08;十&#xff09;&#xff1a;实现图片视频上传下载接口 &#x1f5bc;️&#x1f3a5;系统架构图核心功能设计 &#x1f6e0;️1. 文件上传流程2. 关键技术实现2.1 雪花算法2.2 文件校验机制 ✅2.3 文件去重机制 &#x1f50d;2.…

[JS逆向] 喜马拉雅登录案例 -- 补环境

博客配套代码发布于github&#xff1a;喜马拉雅登录 &#xff08;欢迎顺手Star一下⭐&#xff09; 相关知识点&#xff1a;webpack 补环境 相关爬虫专栏&#xff1a;JS逆向爬虫实战 爬虫知识点合集 爬虫实战案例 逆向知识点合集 此案例目标为逆向成功对应的参数&#xff0c…

大语言模型推理系统综述

摘要 近年来&#xff0c;随着 ChatGPT 等服务推动大语言模型&#xff08;LLM&#xff09;的快速普及&#xff0c;一批专门面向 LLM 推理的系统相继涌现&#xff0c;如 vLLM、SGLang、Mooncake 和 DeepFlow。这些系统设计工作的核心动因是 LLM 请求处理过程中所特有的自回归特性…

用Firecrawl轻松获取网站数据,提升AI应用的效率!

&#x1f525; Firecrawl&#xff1a;助力AI应用的强大工具&#xff01; 在数字化信息爆炸的时代&#xff0c;如何高效地从海量网页中提取有用数据变得尤其重要。Firecrawl的问世&#xff0c;为我们揭开了一种便捷的方法来应对这一挑战。它不仅能够将整个网站的数据转化为适用…

【王阳明代数讲义】谷歌编程智能体Gemini CLI 使用指南、架构详解与核心框架分析

Gemini CLI 使用指南、架构详解与核心框架分析 Gemini CLI 使用指南、架构详解与核心框架分析Gemini CLI 使用指南Gemini CLI 架构详解Gemini CLI 核心框架总结 Gemini CLI 使用指南、架构详解与核心框架分析 Gemini CLI 使用指南 1. 安装与配置 环境要求&#xff1a; Node.…

camera调试:安卓添加xml注册

对接安卓的平台时&#xff0c;需要注册对应的camera设备&#xff0c;供安卓标准api进行操作&#xff0c;rk的平台需要在HAL层配置camera3_profiles.xml文件&#xff0c;适配驱动的信息&#xff0c;进行注册camera设备。该xml对应的内容很多&#xff0c;很多CTS测试问题都是该文…