当前位置: 首页 > 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爬虫实战:研究MechanicalSoup库相关技术

一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...

云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?

大家好&#xff0c;欢迎来到《云原生核心技术》系列的第七篇&#xff01; 在上一篇&#xff0c;我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在&#xff0c;我们就像一个拥有了一块崭新数字土地的农场主&#xff0c;是时…...

渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止

<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet&#xff1a; https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...

linux 错误码总结

1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...

动态 Web 开发技术入门篇

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

基于SpringBoot在线拍卖系统的设计和实现

摘 要 随着社会的发展&#xff0c;社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 在线拍卖系统&#xff0c;主要的模块包括管理员&#xff1b;首页、个人中心、用户管理、商品类型管理、拍卖商品管理、历史竞拍管理、竞拍订单…...

【Android】Android 开发 ADB 常用指令

查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...

PostgreSQL——环境搭建

一、Linux # 安装 PostgreSQL 15 仓库 sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-$(rpm -E %{rhel})-x86_64/pgdg-redhat-repo-latest.noarch.rpm# 安装之前先确认是否已经存在PostgreSQL rpm -qa | grep postgres# 如果存在&#xff0…...

Proxmox Mail Gateway安装指南:从零开始配置高效邮件过滤系统

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐&#xff1a;「storms…...