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 {
    @Id
    private 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 {

    @Autowired
    private MongoTemplate mongoTemplate;

    @Test
    public 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 {

    @Autowired
    private MongoTemplate mongoTemplate;
    
    @Test
    public 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({})

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/791472.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

土壤分析仪:解密土壤之奥秘的科技先锋

在农业生产和生态保护的道路上&#xff0c;土壤的质量与状况一直是我们关注的焦点。土壤分析仪&#xff0c;作为现代科技在农业和环保领域的杰出代表&#xff0c;以其高效、精准的分析能力&#xff0c;为我们揭示了土壤的奥秘&#xff0c;为农业生产提供了科学指导&#xff0c;…

(Windows环境)FFMPEG编译,包含编译x264以及x265

本文使用 MSYS2 来编译 ffmpeg 一、安装MSYS2 MSYS2 是 Windows 下的一组编译套件&#xff0c;它可以在 Windows 系统中模拟 Linux 下的编译环境&#xff0c;如使用 shell 运行命令、使用 pacman 安装软件包、使用 gcc (MinGW) 编译代码等。 MSYS2 的安装也非常省心&#x…

深度探讨:无法恢复主文件表的困境与解救之道

在数据存储与管理的复杂世界中&#xff0c;主文件表&#xff08;Master File Table, MFT&#xff09;作为文件系统的核心组件&#xff0c;承载着至关重要的角色。一旦遭遇无法恢复主文件表的困境&#xff0c;用户将面临数据访问受限、文件丢失等严重后果。这通常是由于硬件故障…

leetcode 1421 净现值查询(postgresql)

需求 表: NPV ---------------------- | Column Name | Type | ---------------------- | id | int | | year | int | | npv | int | ---------------------- (id, year) 是该表主键. 该表有每一笔存货的年份, id 和对应净现值的信息. 表: Queries ---------------------- …

C语言 | Leetcode C语言题解之第227题基本计算题II

题目&#xff1a; 题解&#xff1a; int calculate(char* s) {int n strlen(s);int stk[n], top 0;char preSign ;int num 0;for (int i 0; i < n; i) {if (isdigit(s[i])) {num num * 10 (int)(s[i] - 0);}if (!isdigit(s[i]) && s[i] ! || i n - 1) {s…

机器学习筑基篇,容器调用显卡计算资源,Ubuntu 24.04 快速安装 NVIDIA Container Toolkit!...

[ 知识是人生的灯塔,只有不断学习,才能照亮前行的道路 ] Ubuntu 24.04 安装 NVIDIA Container Toolkit 什么是 NVIDIA Container Toolkit? 描述:NVIDIA Container Toolkit(容器工具包)使用户能够构建和运行 GPU 加速的容器,该工具包括一个容器运行时库和实用程序,用于自动…

Django项目创建的基本准备工作【4】

【 一 】软件开发模式 官话下面 人话 瀑布开发就是将什东西都定义好了在进行开发对吧 敏捷就是进行模块化一样 分批进行 规定一个时间段完成什么样的功能。 总结来说&#xff0c;瀑布开发强调在项目开始之前进行详细的计划和准备&#xff0c;并按照预定的顺序逐步进行&#x…

ScrapySharp框架:小红书视频数据采集的API集成与应用

引言 随着大数据时代的到来&#xff0c;数据采集成为了互联网企业获取信息的重要手段。小红书作为一个集社交和电商于一体的平台&#xff0c;其丰富的用户生成内容&#xff08;UGC&#xff09;为数据采集提供了丰富的资源。本文将介绍如何使用ScrapySharp框架进行小红书视频数…

aws sap认证考试如何轻松通过

如何高效备考AWS SAP (Solutions Architect Professional) 认证? AWS SAP认证是AWS认证体系中难度最高的认证之一,要通过这个考试确实需要下一番功夫。但通过合理规划和有效准备,你可以提高通过的几率。以下是一些建议: 评估起点 首先诚实地评估自己的AWS知识水平和实践经验。…

科普文:Java对象在堆中的内存结构

概叙 今天来讲些抽象的东西 -- 对象头&#xff0c;因为我在学习的过程中发现很多地方都关联到了对象头的知识点&#xff0c;例如JDK中的 synchronized锁优化 和 JVM 中对象年龄升级等等。 对象内存构成# Java 中通过 new 关键字创建一个类的实例对象&#xff0c;对象存于内存的…

Nginx -Web服务器/反向代理/负载均衡

文章目录 一、web服务1.1 nginx安装1.2 配置文件1.3 Nginx处理Web机制 二、反向代理三、负载均衡3.1 分类3.2 负载相关配置文件3.3 keepalive 提高吞吐量3.4 配置浏览器缓存 附、JMeter性能测试工具 以赛促学内容,大概率感觉会使用nginx做web服务,特对nginx做总结归纳. Nginx是…

DOM 基本操作 - 事件基础

theme: smartblue 一、事件概述 JavaScript使我们有能力创建动态页面&#xff0c;而事件是可以被JavaScript侦测到的行为。 简单理解: 触发---响应机制。 网页中的每个元素都可以产生某些可以触发JavaScript的事件&#xff0c;例如&#xff0c;我们可以在用户点击某按钮时产生一…

矩阵分解及其在机器学习中的应用

阵分解是一种广泛应用于数据挖掘和机器学习领域的技术&#xff0c;它通过将一个高维数据集分解为多个低维的数据集&#xff0c;以降低数据的复杂性、提高计算效率&#xff0c;并发现数据中的隐含结构。本文将详细介绍矩阵分解的基本概念、主要方法及其在机器学习中的应用。 一、…

【卡尔曼滤波器】DR_CAN :1_递归算法_做估计 学习笔记

DR_CAN : 1_递归算法_Recursive Processing 学习笔记 DR_CAN 大神 地址 1_递归算法_Recursive Processing 取平均 做估计 前k-1次的平均值 当前估计值 与上次估计值和当前测量值的关系

【Docker系列】Docker 镜像源:优化你的容器化开发流程

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

前端/python脚本/转换-使用天地图下载的geojson(echarts4+如果直接使用会导致坐标和其他信息不全)

解决echarts4如果直接使用天地图下载的geojson会导致坐标和其他信息不全 解决方法是使用python脚本来补全其他信息&#xff1a;center&#xff0c;level&#xff0c;adcode等内容 前提是必须有一个之前使用的json文件&#xff08;需要全一点的数据供echarts使用&#xff09; …

对controller层进行深入学习

目录 1. controller层是干什么的&#xff1f;1.1 controller原理图1.2 controller层为什么要存在&#xff1f;1.2.1 分离关注点1.2.2 响应HTTP请求1.2.3 数据处理与转换1.2.4 错误处理与状态管理1.2.5 流程控制1.2.6 依赖注入与测试 1.3 controller层的优点1.3.1 多端支持1.3.2…

Github 2024-07-11 Go开源项目日报 Top10

根据Github Trendings的统计,今日(2024-07-11统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Go项目10Solidity项目1Python项目1frp: 一个开源的快速反向代理 创建周期:2946 天开发语言:Go协议类型:Apache License 2.0Star数量:75872 …

【链表】- 环形链表 II

1. 对应力扣题目连接 环形链表 II 2. 实现思路 a. 链表图示&#xff1a; b. 检测链表中是否存在环&#xff0c;即&#xff1a;会相交 思路&#xff1a; 使用 Floyd 的龟兔赛跑算法&#xff08;Floyd’s Tortoise and Hare algorithm&#xff09;&#xff0c;即快慢指针法&…

ChatGPT提问获取高质量答案的艺术PDF下载书籍推荐分享

ChatGPT高质量prompt技巧分享pdf&#xff0c; ChatGPT提问获取高质量答案的艺术pdf。本书是一本全面的指南&#xff0c;介绍了各种 Prompt 技术的理解和利用&#xff0c;用于从 ChatGPTmiki sharing中生成高质量的答案。我们将探讨如何使用不同的 Prompt 工程技术来实现不同的目…