MongoDB - 集合和文档的增删改查操作
文章目录
- 1. MongoDB 运行命令
- 2. MongoDB CRUD操作
- 1. 新增文档
- 1. 新增单个文档 insertOne
- 2. 批量新增文档 insertMany
- 2. 查询文档
- 1. 查询所有文档
- 2. 指定相等条件
- 3. 使用查询操作符指定条件
- 4. 指定逻辑操作符 (`AND` / `OR`)
- 3. 更新文档
- 1. 更新操作符语法
- 2. 更新单个文档 updateOne
- 3. 批量更新文档 updateMany
- 4. 删除文档
- 1. 删除单个文档 deleteOne
- 2. 删除符合条件的所有文档 deleteMany
- 3. 删除所有文档 deleteMany
1. MongoDB 运行命令
① 列出用户可用的数据库:
> show dbs
admin 0.000GB
config 0.000GB
knowledge 0.000GB
local 0.002GB
test 0.000GB
② 切换数据库:
> use test
switched to db test
③ 显示正在使用的数据库:
> db
test
④ 查看当前数据库下的所有集合:
> show collections
A
B
⑤ 创建集合:
> db.createCollection("t_incident")
{ "ok" : 1 }
如果集合不存在,MongoDB 会在您首次存储该集合的数据时创建该集合。
> db.myCollection.insertOne( { x: 1 } );
{"acknowledged" : true,"insertedId" : ObjectId("668bb336021f261e315be637")
}
2. MongoDB CRUD操作
SpringBoot集成MongoDB需要在项目中添加MongoDB的依赖。在pom.xml文件中添加以下依赖:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
创建一个实体类来映射MongoDB中的文档:
@AllArgsConstructor
@NoArgsConstructor
@Data
@Document(collection = "user")
public class User {@Idprivate String id;private String name;private Integer age;private String email;public User(String name,Integer age,String email){this.name = name;this.age = age;this.email = email;}
}
1. 新增文档
1. 新增单个文档 insertOne
insertOne 命令用于新增单个文档,语法如下:
db.collection.insertOne({ key1: value1, key2: value2, ... });
其中,db.collection 是要新增文档的集合名称,key1、key2等是文档中的字段名称,而value1、value2等是对应字段的值。如果文档未指定 _id
字段,MongoDB 会将具有 ObjectId 值的 _id
字段添加到新文档中。
db.user.insertOne({ name: "Alice", age: 25, email: "alice@example.com" })
在代码中使用MongoTemplate来插入一条文档:
@SpringBootTest
@RunWith(SpringRunner.class)
public class BeanLoadServiceTest {@Autowiredprivate MongoTemplate mongoTemplate;@Testpublic void insertUser() {User user = new User();user.setName("Alice");user.setAge(25);user.setEmail("alice@example.com");// mongoTemplate.insertAll(users);mongoTemplate.insert(user);}
}
2. 批量新增文档 insertMany
insertMany 用于插入多个文档:
db.collection.insertMany([{ key1: value1, key2: value2, ... },{ key1: value3, key2: value4, ... },...
]);
其中,db.collection是你要插入文档的集合名称。key1、key2等是文档中的字段名称,而value1、value2等是对应字段的值。
db.user.insertMany([{ name: "John", age: 30, email: "11@qq.com" },{ name: "Jane", age: 25, email: "22@qq.com" },{ name: "Mike", age: 35, email: "33@qq.com" }
]);
@SpringBootTest
@RunWith(SpringRunner.class)
public class BeanLoadServiceTest {@Autowiredprivate MongoTemplate mongoTemplate;@Testpublic void insertUser() {List<User> users = Arrays.asList(new User("John", 30, "11@qq.com"),new User("Jane", 25, "22@qq.com"),new User("Mike", 35, "33@qq.com"));mongoTemplate.insert(users,"user");// mongoTemplate.insertAll(users);}
}
2. 查询文档
查询筛选器文档指定条件,确定选择哪些记录进行读取、更新和删除操作。
可以使用 :
表达式指定相等条件和查询运算符表达式。
{<field1>: <value1>,<field2>: { <operator>: <value> },...
}
1. 查询所有文档
要查询 MongoDB 集合中的所有文档,可以使用 find() 方法。
db.collectionName.find()
其中,collectionName 是你要查询的集合的名称。执行这个命令后,MongoDB 将返回集合中的所有文档。
如果你想要以更可读的方式显示结果,可以使用 pretty() 方法:
db.collectionName.find().pretty()
查询user集合中的所有文档:
db.user.find()
@Test
public void findUser() {Query query = new Query();List<User> users = mongoTemplate.find(query, User.class);// List<User> users = mongoTemplate.findAll(User.class,"user");users.forEach(System.out::println);
}
2. 指定相等条件
要选择匹配相等条件的文档,请在<field>:<value>
中将条件指定为查询过滤器文档。
查询user集合中为"John"的所有文档:
db.user.find( { name: "John" } )
@Test
public void findUser() {// 创建查询条件Criteria criteria = Criteria.where("name").is("John");// 创建查询对象Query query = new Query(criteria);// 执行查询List<User> users = mongoTemplate.find(query, User.class);users.forEach(System.out::println);
}
此操作对应于以下 SQL 语句:
SELECT * FROM user WHERE name = "John"
查询user集合中匹配查询条件name为"John"的第一个文档:
db.user.findOne( { "name": "John" } )
@Test
public void findUser() {// 创建查询条件Criteria criteria = Criteria.where("name").is("John");// 创建查询对象Query query = new Query(criteria);// 执行查询User user = mongoTemplate.findOne(query, User.class);System.out.println(user);
}
3. 使用查询操作符指定条件
在查询过滤器文档中使用查询操作符来执行更复杂的比较和评估。
查询user集合中name为 "John"或者 “Alice” 的所有文档:
db.user.find( { name: { $in: [ "John", "Alice" ] } } )
注意,尽管您可以使用 $or
操作符来表示此查询,但在对同一字段执行相等检查时,请使用 $in
操作符而不是 $or
操作符。
此操作对应于以下 SQL 语句:
SELECT * FROM user WHERE name in ("John", "Alice" )
@Test
public void findUser() {// 创建查询条件Criteria criteria = Criteria.where("name").in("John", "Alice");// 创建查询对象Query query = new Query(criteria);// 执行查询List<User> users = mongoTemplate.find(query, User.class, "user");users.forEach(System.out::println);
}
查询user集合中匹配查询条件name为 "John"或者 “Alice” 的第一个文档
db.user.findOne( { name: { $in: [ "John", "Alice" ] } } )
@Test
public void findUser() {// 创建查询条件Criteria criteria = Criteria.where("name").in("John", "Alice");// 创建查询对象Query query = new Query(criteria);// 执行查询User user = mongoTemplate.findOne(query, User.class);
}
4. 指定逻辑操作符 (AND
/ OR
)
复合查询可以为集合文档中的多个字段指定条件。
① 逻辑 AND
连接词隐式地连接复合查询的子句,以便该查询选择集合中与所有条件匹配的文档。
查询user集合中name为Alice且age>20的文档:
db.user.find( { name: "Alice", "age": { $gte: 20 } } )
@Test
public void findUser() {// 创建查询条件Criteria criteria = new Criteria();criteria.and("name").is("Alice");criteria.and("age").gte(20);// 创建查询对象Query query = new Query(criteria);// 执行查询List<User> users = mongoTemplate.find(query, User.class, "user");
}
② 使用 $or
操作符指定复合查询,该复合查询使用逻辑 OR
结合使用每个子句,以便查询选择集合中至少匹配一个条件的文档。
查询user集合中email为 "11@qq.com"且age>20或者name为"John"的文档:
db.user.find( {email: "11@qq.com",$or: [ { "age": { $gte: 20 } }, { name: "John" } ]
} )
@Test
public void findUser() {Query query = new Query();query.addCriteria(Criteria.where("email").is("11@qq.com").orOperator(Criteria.where("age").gte(20), Criteria.where("name").is("John")));List<User> users = mongoTemplate.find(query, User.class);users.forEach(System.out::println);
}
3. 更新文档
1. 更新操作符语法
要更新文档,MongoDB 提供了更新操作符(例如$set
)来修改字段值。要使用更新操作符,请向更新方法传递以下形式的更新文档:
{<update operator>: { <field1>: <value1>, ... },<update operator>: { <field2>: <value2>, ... },...
}
某些更新操作符(例如 $set
)会在字段不存在的情况下创建字段。
2. 更新单个文档 updateOne
① 更新字段的值:更新user集合中与指定筛选器匹配的第一个文档,将name为"John"的age更新为22
db.user.updateOne( { name: "John" },{$set: {age: 22}}
)
@Test
public void updateUser(){// 查询对象Query query = new Query(Criteria.where("name").is("John"));// 更新对象Update update = new Update().set("age", 22);mongoTemplate.updateFirst(query, update, User.class);
}
② 新增字段:
db.user.updateOne( { name: "John" },{$set: {city: "ShangHai"}}
)
@Test
public void updateUser(){// 查询对象Query query = new Query(Criteria.where("name").is("John"));// 更新对象Update update = new Update().set("city", "ShangHai");mongoTemplate.updateFirst(query, update, User.class);
}
③ 删除字段:
db.user.updateOne( { name: "John" },{$unset: {city: ""}}
)
@Test
public void updateUser(){// 查询对象Query query = new Query(Criteria.where("name").is("John"));// 更新对象Update update = new Update().unset("city");mongoTemplate.updateFirst(query, update, User.class);
}
3. 批量更新文档 updateMany
updateMany 更新与指定过滤器匹配的所有文档。
更新user集合中 age小于等于25的所有文档,将email设置为"hh@qq.com",将age设置为28。
db.user.updateMany({ age: { $lt: 25 } },{$set: { email: "hh.qq.com",age:28 }}
)
@Test
public void updateUser(){// 构建查询条件Criteria criteria = Criteria.where("age").gte(25);Query query = Query.query(criteria);// 构建更新操作Update update = new Update();update.set("email", "hh.qq.com");update.set("age", 28);// 执行更新操作mongoTemplate.updateMulti(query, update, "user");
}
4. 删除文档
1. 删除单个文档 deleteOne
deleteOne 用于删除与指定过滤器匹配的单个文档。删除user集合中匹配name为"Alice"的第一个文档:
db.user.deleteOne( { name: "Alice" } )
@Test
public void deleteUser(){Query query = new Query();query.addCriteria(Criteria.where("name").is("Alice"));mongoTemplate.remove(query,User.class);
}
2. 删除符合条件的所有文档 deleteMany
您可以指定条件或过滤器来标识要删除的文档。过滤器使用与读取操作相同的语法。删除user集合age=28的所有文档:
db.user.deleteMany( { age:28 } )
3. 删除所有文档 deleteMany
要删除集合中的所有文档,将空的过滤器文档 {}
传递到 db.collection.deleteMany()
方法。
db.user.deleteMany({})
相关文章:

MongoDB - 集合和文档的增删改查操作
文章目录 1. MongoDB 运行命令2. MongoDB CRUD操作1. 新增文档1. 新增单个文档 insertOne2. 批量新增文档 insertMany 2. 查询文档1. 查询所有文档2. 指定相等条件3. 使用查询操作符指定条件4. 指定逻辑操作符 (AND / OR) 3. 更新文档1. 更新操作符语法2. 更新单个文档 updateO…...
【深度学习基础】安装包报错——MAC M3-MAX芯片安装scikit-learn库报错。
目录 一、问题描述二、解决方法 一、问题描述 首先想安装scikit-learn库在mac终端显示顺利安装完成,但是测试的时候报错如下所示: /opt/anaconda3/envs/dtc/bin/python /Users/chenfaquan/PycharmProjects/TimeSeries/data_create.py Traceback (most…...

【chatgpt消费者偏好】是什么驱动了游客持续旅游意愿?推文分享—2024-07-08
今天推文的主题是【chatgpt&消费者意愿】 第一篇:文章主要研究了什么因素驱动旅游者继续使用ChatGPT进行旅行服务,并从人类拟态的角度探讨了旅游者对ChatGPT的感知和使用意图。第二篇:本文探讨了ChatGPT-4在生成针对TripAdvisor上发布的…...

torchplus
https://gitee.com/hj_research/torchplus 一、安装 pip install tplus...
LeetCode之最长回文子串
1.题目链接 5. 最长回文子串 - 力扣(LeetCode)https://leetcode.cn/problems/longest-palindromic-substring/description/ 2.题目解析 对于这道题目我们可以使用动态规划的思路来求解,具体思路是,对于一个长度大于2的子串&…...
Gradle 介绍
Gradle 定义 Gradle 是一个现代化的构建自动化工具,用于管理软件项目的构建过程和依赖关系。它通过一种灵活且强大的 DSL(领域特定语言)语法来描述项目的构建逻辑和任务,可以用于构建几乎任何类型的软件项目,从简单的应…...

短视频矩阵:批量发布的秘密揭秘
在数字化时代,短视频已经成为一种广受欢迎的媒体形式。无论是用于品牌推广、产品营销还是个人创作,短视频都提供了一种直观、生动的方式来吸引观众的注意力。然而,有效地制作、管理和发布短视频对于许多创作者和企业来说是一个挑战。 为此&am…...
基于 Nginx + Spring Boot + Vue + JPA 的网站安全防护指南
引言 在现代互联网时代,确保网站的安全性非常重要。尤其是基于前后端分离架构,更需要特别注意安全防护。接下来,带你了解几种常见的安全攻击及其应对措施。 常见的安全攻击及应对措施 1. 跨站脚本攻击 (XSS) 攻击描述: 跨站脚…...
Perl词法切分器:文本解析的瑞士军刀
📖 Perl词法切分器:文本解析的瑞士军刀 在编程语言中,词法分析是编译过程的第一步,它涉及将输入的源代码分解成一个个的词素或标记。Perl作为一种功能强大的文本处理语言,提供了丰富的工具来进行词法切分。本文将深入…...

基于深度学习LightWeight的人体姿态之行为识别系统源码
一. LightWeight概述 light weight openpose是openpose的简化版本,使用了openpose的大体流程。 Light weight openpose和openpose的区别是: a 前者使用的是Mobilenet V1(到conv5_5),后者使用的是Vgg19(前10…...

Mac窗口辅助管理工具:Magnet for mac激活版
magnet mac版是一款运行在苹果电脑上的一款优秀的窗口大小控制工具,拖拽窗口到屏幕边缘可以自动半屏,全屏或者四分之一屏幕,还可以设定快捷键完成分屏。这款专业的窗口管理工具当您每次将内容从一个应用移动到另一应用时,当您需要…...

DWM 相关实现代码 [自用]
1. DWM 缩略图和模糊隐藏实现半透明 #include <windows.h> #include <dwmapi.h> #include <string> #pragma comment(lib, "dwmapi.lib")// 检查 UWP 窗口是否可见 bool IsUWPWindowVisible(HWND hwnd) {DWORD cloaked 0;DwmGetWindowAttribute(…...
根据样本数据的区域分布进行重采样
希望根据数据的区域分布进行重采样,通常用于处理空间数据或具有明显区域特征的数据。 文章目录 重采样整体思路数据集重采样步骤 区域划分的方法具体代码案例1. 基于规则的划分2. 基于密度的划分3. 基于层次的划分4. 基于图的划分5. 基于网格的划分6. 基于自组织映射…...

数据库之MQL
1,查询所有 mysql> select * from grade;2, mysql> select id,firstname,lastname from grade;3, mysql> select firstname,lastname from grade where id > 4;4, mysql> select * from grade where sex f;5&…...

LabVIEW平台从离散光子到连续光子的光子计数技术
光子计数技术用于将输入光子数转换为离散脉冲。常见的光子计数器假设光子是离散到达的,记录到来的每一个光子。但是,当两个或多个光子同时到达时,计数器会将其记录为单个脉冲,从而只计数一次。当连续光子到达时,离散光…...

【Linux】Windows平台使用gdb调试FFmpeg源码
FFmpeg是一个跨平台的多媒体库,有时需要在别的平台上进行开发和调试,记录一下在linux环境下使用gdb来调试FFmpeg源码的基本方式 1.可执行文件 在windows平台使用linux环境来调试FFmpeg源码,需要编译生成一个后缀有_g的exe文件,参…...

提交表单form之后发送表单内容到指定邮箱(单php文件实现)
提交各种表单之后,自动将表单的内容通过邮件api接口的形式自动发送到指定的邮箱。步骤如下: 1.在aoksend注册一个账号。 2.绑定一个自己的域名。做域名解析之后验证。验证通过后自动提交审核。等待审核通过。 3.设置一个邮件模板。aoksend内置了一些优…...
【设计模式之美】策略模式方法论:解耦策略的定义、创建和使用
文章目录 一. 策略的定义-封装策略,面向接口二. 策略的创建-创建策略工厂1. 对于无状态策略2. 对于有状态策略 三. 策略的使用:动态选择四. 避免分支判断-策略的优雅1. 对于无状态的策略2. 对于有状态的策略 策略模式是定义一族算法类,将每个…...
解析 pdfminer pdfparser.py
解析 pdfminer pdfparser.py 1. 导入必要的模块2. 定义PDFParser类2.1 初始化方法2.2 设置文档方法2.3 处理关键词方法举例说明: 3. 定义PDFStreamParser类3.1 初始化方法3.2 刷新方法3.3 处理关键词方法 总结 今天我们来看一段Python代码,这段代码实现了一个PDF文件的解析器。…...
day10:03 一文搞懂encode和encoding的区别
在Python中,处理字符串时经常会遇到encode()方法和encoding参数,它们都与字符串的编码和解码有关,但用途和上下文有所不同。下面通过案例来解释它们的关系和区别。 1. encode() 方法 encode()方法是字符串(str)类型的…...
【网络】每天掌握一个Linux命令 - iftop
在Linux系统中,iftop是网络管理的得力助手,能实时监控网络流量、连接情况等,帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...
【Linux】shell脚本忽略错误继续执行
在 shell 脚本中,可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行,可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令,并忽略错误 rm somefile…...
Leetcode 3576. Transform Array to All Equal Elements
Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接:3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到…...

AI Agent与Agentic AI:原理、应用、挑战与未来展望
文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例:使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例:使用OpenAI GPT-3进…...

ardupilot 开发环境eclipse 中import 缺少C++
目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...
CSS设置元素的宽度根据其内容自动调整
width: fit-content 是 CSS 中的一个属性值,用于设置元素的宽度根据其内容自动调整,确保宽度刚好容纳内容而不会超出。 效果对比 默认情况(width: auto): 块级元素(如 <div>)会占满父容器…...
C++.OpenGL (14/64)多光源(Multiple Lights)
多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...
SQL慢可能是触发了ring buffer
简介 最近在进行 postgresql 性能排查的时候,发现 PG 在某一个时间并行执行的 SQL 变得特别慢。最后通过监控监观察到并行发起得时间 buffers_alloc 就急速上升,且低水位伴随在整个慢 SQL,一直是 buferIO 的等待事件,此时也没有其他会话的争抢。SQL 虽然不是高效 SQL ,但…...
Mysql8 忘记密码重置,以及问题解决
1.使用免密登录 找到配置MySQL文件,我的文件路径是/etc/mysql/my.cnf,有的人的是/etc/mysql/mysql.cnf 在里最后加入 skip-grant-tables重启MySQL服务 service mysql restartShutting down MySQL… SUCCESS! Starting MySQL… SUCCESS! 重启成功 2.登…...

[大语言模型]在个人电脑上部署ollama 并进行管理,最后配置AI程序开发助手.
ollama官网: 下载 https://ollama.com/ 安装 查看可以使用的模型 https://ollama.com/search 例如 https://ollama.com/library/deepseek-r1/tags # deepseek-r1:7bollama pull deepseek-r1:7b改token数量为409622 16384 ollama命令说明 ollama serve #:…...