当前位置: 首页 > news >正文

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终端显示顺利安装完成&#xff0c;但是测试的时候报错如下所示&#xff1a; /opt/anaconda3/envs/dtc/bin/python /Users/chenfaquan/PycharmProjects/TimeSeries/data_create.py Traceback (most…...

【chatgpt消费者偏好】是什么驱动了游客持续旅游意愿?推文分享—2024-07-08

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

torchplus

https://gitee.com/hj_research/torchplus 一、安装 pip install tplus...

LeetCode之最长回文子串

1.题目链接 5. 最长回文子串 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/longest-palindromic-substring/description/ 2.题目解析 对于这道题目我们可以使用动态规划的思路来求解&#xff0c;具体思路是&#xff0c;对于一个长度大于2的子串&…...

Gradle 介绍

Gradle 定义 Gradle 是一个现代化的构建自动化工具&#xff0c;用于管理软件项目的构建过程和依赖关系。它通过一种灵活且强大的 DSL&#xff08;领域特定语言&#xff09;语法来描述项目的构建逻辑和任务&#xff0c;可以用于构建几乎任何类型的软件项目&#xff0c;从简单的应…...

短视频矩阵:批量发布的秘密揭秘

在数字化时代&#xff0c;短视频已经成为一种广受欢迎的媒体形式。无论是用于品牌推广、产品营销还是个人创作&#xff0c;短视频都提供了一种直观、生动的方式来吸引观众的注意力。然而&#xff0c;有效地制作、管理和发布短视频对于许多创作者和企业来说是一个挑战。 为此&am…...

基于 Nginx + Spring Boot + Vue + JPA 的网站安全防护指南

引言 在现代互联网时代&#xff0c;确保网站的安全性非常重要。尤其是基于前后端分离架构&#xff0c;更需要特别注意安全防护。接下来&#xff0c;带你了解几种常见的安全攻击及其应对措施。 常见的安全攻击及应对措施 1. 跨站脚本攻击 (XSS) 攻击描述&#xff1a; 跨站脚…...

Perl词法切分器:文本解析的瑞士军刀

&#x1f4d6; Perl词法切分器&#xff1a;文本解析的瑞士军刀 在编程语言中&#xff0c;词法分析是编译过程的第一步&#xff0c;它涉及将输入的源代码分解成一个个的词素或标记。Perl作为一种功能强大的文本处理语言&#xff0c;提供了丰富的工具来进行词法切分。本文将深入…...

基于深度学习LightWeight的人体姿态之行为识别系统源码

一. LightWeight概述 light weight openpose是openpose的简化版本&#xff0c;使用了openpose的大体流程。 Light weight openpose和openpose的区别是&#xff1a; a 前者使用的是Mobilenet V1&#xff08;到conv5_5&#xff09;&#xff0c;后者使用的是Vgg19&#xff08;前10…...

Mac窗口辅助管理工具:Magnet for mac激活版

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

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(…...

根据样本数据的区域分布进行重采样

希望根据数据的区域分布进行重采样&#xff0c;通常用于处理空间数据或具有明显区域特征的数据。 文章目录 重采样整体思路数据集重采样步骤 区域划分的方法具体代码案例1. 基于规则的划分2. 基于密度的划分3. 基于层次的划分4. 基于图的划分5. 基于网格的划分6. 基于自组织映射…...

数据库之MQL

1&#xff0c;查询所有 mysql> select * from grade;2&#xff0c; mysql> select id,firstname,lastname from grade;3&#xff0c; mysql> select firstname,lastname from grade where id > 4;4&#xff0c; mysql> select * from grade where sex f;5&…...

LabVIEW平台从离散光子到连续光子的光子计数技术

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

【Linux】Windows平台使用gdb调试FFmpeg源码

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

提交表单form之后发送表单内容到指定邮箱(单php文件实现)

提交各种表单之后&#xff0c;自动将表单的内容通过邮件api接口的形式自动发送到指定的邮箱。步骤如下&#xff1a; 1.在aoksend注册一个账号。 2.绑定一个自己的域名。做域名解析之后验证。验证通过后自动提交审核。等待审核通过。 3.设置一个邮件模板。aoksend内置了一些优…...

【设计模式之美】策略模式方法论:解耦策略的定义、创建和使用

文章目录 一. 策略的定义-封装策略&#xff0c;面向接口二. 策略的创建-创建策略工厂1. 对于无状态策略2. 对于有状态策略 三. 策略的使用&#xff1a;动态选择四. 避免分支判断-策略的优雅1. 对于无状态的策略2. 对于有状态的策略 策略模式是定义一族算法类&#xff0c;将每个…...

解析 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中&#xff0c;处理字符串时经常会遇到encode()方法和encoding参数&#xff0c;它们都与字符串的编码和解码有关&#xff0c;但用途和上下文有所不同。下面通过案例来解释它们的关系和区别。 1. encode() 方法 encode()方法是字符串&#xff08;str&#xff09;类型的…...

python/java环境配置

环境变量放一起 python&#xff1a; 1.首先下载Python Python下载地址&#xff1a;Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个&#xff0c;然后自定义&#xff0c;全选 可以把前4个选上 3.环境配置 1&#xff09;搜高级系统设置 2…...

线程同步:确保多线程程序的安全与高效!

全文目录&#xff1a; 开篇语前序前言第一部分&#xff1a;线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分&#xff1a;synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分&#xff…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)

宇树机器人多姿态起立控制强化学习框架论文解析 论文解读&#xff1a;交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架&#xff08;一&#xff09; 论文解读&#xff1a;交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...

【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)

升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点&#xff0c;但无自动故障转移能力&#xff0c;Master宕机后需人工切换&#xff0c;期间消息可能无法读取。Slave仅存储数据&#xff0c;无法主动升级为Master响应请求&#xff…...

Unit 1 深度强化学习简介

Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库&#xff0c;例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体&#xff0c;比如 SnowballFight、Huggy the Do…...

JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案

JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停​​ 1. ​​安全点(Safepoint)阻塞​​ ​​现象​​:JVM暂停但无GC日志,日志显示No GCs detected。​​原因​​:JVM等待所有线程进入安全点(如…...

【Oracle】分区表

个人主页&#xff1a;Guiat 归属专栏&#xff1a;Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...

动态 Web 开发技术入门篇

一、HTTP 协议核心 1.1 HTTP 基础 协议全称 &#xff1a;HyperText Transfer Protocol&#xff08;超文本传输协议&#xff09; 默认端口 &#xff1a;HTTP 使用 80 端口&#xff0c;HTTPS 使用 443 端口。 请求方法 &#xff1a; GET &#xff1a;用于获取资源&#xff0c;…...

TSN交换机正在重构工业网络,PROFINET和EtherCAT会被取代吗?

在工业自动化持续演进的今天&#xff0c;通信网络的角色正变得愈发关键。 2025年6月6日&#xff0c;为期三天的华南国际工业博览会在深圳国际会展中心&#xff08;宝安&#xff09;圆满落幕。作为国内工业通信领域的技术型企业&#xff0c;光路科技&#xff08;Fiberroad&…...

【堆垛策略】设计方法

堆垛策略的设计是积木堆叠系统的核心&#xff0c;直接影响堆叠的稳定性、效率和容错能力。以下是分层次的堆垛策略设计方法&#xff0c;涵盖基础规则、优化算法和容错机制&#xff1a; 1. 基础堆垛规则 (1) 物理稳定性优先 重心原则&#xff1a; 大尺寸/重量积木在下&#xf…...