MongoDB - 集合和文档的增删改查操作

news2024/9/21 14:49:35

文章目录

    • 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({})

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【AI前沿】深度学习:神经网络基础

文章目录 &#x1f4d1;引言一、神经元和感知器1.1 神经元的基本概念1.2 感知器模型 二、多层感知器&#xff08;MLP&#xff09;2.1 MLP的基本结构2.2 激活函数的重要性2.3 激活函数2.4 激活函数的选择 三、小结 &#x1f4d1;引言 深度学习是现代人工智能的核心技术之一&…

p12初步认识c语言

1.初识c语言 什么是c语言 c语言是一门计算机语言 计算机语言是什么 人和计算机交流语言 c/c/JAVA/python 语言发展&#xff1a; 二进制语言 硬件-电-正电/负电 1010001010101010101010101010手册 科学家 1010100010-ADD -助记符-汇编语言 B语言 C语言 C、---高级…

【全面介绍语言模型的原理,实战和评估】

🎥博主:程序员不想YY啊 💫CSDN优质创作者,CSDN实力新星,CSDN博客专家 🤗点赞🎈收藏⭐再看💫养成习惯 ✨希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共同学习、交流进步! 🥂语言模型的原理 🥂语言模型基于统计和机器学习的原理,目标…

实验1 —— 安全策略的练习

实验拓扑图 实验要求 1.DMZ区内的服务器&#xff0c;办公区仅能在办公时间内&#xff08;9&#xff1a;00-18&#xff1a;00&#xff09;可以访问&#xff0c;生产区的设备全天可以访问&#xff1b; 2.生产区不允许访问互联网&#xff0c;办公区和游客区允许访问互联网 3.办公区…

Java protobuf序列化

Protobuf概述 Protobuf&#xff08;全称&#xff1a;Protocol Buffers&#xff09;是由 Google 开发的一种语言中立、平台无关、可扩展的序列化协议。它用于高效地结构化数据的序列化和反序列化。Protobuf 的主要特点是其紧凑、高效和可扩展的编码格式&#xff0c;使其在各种网…

Nginx中文URL请求404

这两天正在搞我的静态网站。方案是&#xff1a;从思源笔记Markdown笔记&#xff0c;用MkOcs build成静态网站&#xff0c;上传到到Nginx服务器。遇到一个问题&#xff1a;URL含有中文会404&#xff0c;全英文URL则正常访问。 ‍ 比如&#xff1a; ​​ ‍ 设置了utf-8 ht…

mac安装配置cmake

本机是2015 macbook pro mid&#xff0c;已经有点老了&#xff0c;用homebrew下cmake老出问题 其实cmake官网安装也不麻烦 一、官网下载对应安装包 Download CMake 和所有dmg文件一样安装 二、改成命令行使用 一般来说 tutorial 给的都是命令行build 命令行的设置如下&am…

React Hooks学习笔记

一、usestate的使用方法-初始化state函数 import React, { useState } from "react"; function App() {const [count, setCount] useState(0);return (<div><p>点击{count}次</p><button onClick{() > setCount(count 1)}>点击</bu…

【TAROT学习日记】韦特体系塔罗牌学习(1)——愚者 THE FOOL 0

韦特体系塔罗牌学习&#xff08;1&#xff09;——愚者 THE FOOL 0 https://www.tarotchina.net/major-arcana0-vip/ 目录 韦特体系塔罗牌学习&#xff08;1&#xff09;——愚者 THE FOOL 0牌面分析1. 基础信息2. 图片元素 正位牌意1. 关键词/句2.爱情婚姻3. 学业事业4. 人际关…

原生小程序生成二维码并保存到本地

需求&#xff1a;我要在一个页面中生成一个二维码&#xff0c;并且这个二维码可以长按保存到本地或者发送给好友&#xff1b; 我这里是将生成的canvas二维码转换成图片&#xff0c;利用长按图片进行保存或转发 效果图&#xff1a; 第一步先下载对应的包&#xff1a; npm instal…

Web3知识图谱,一篇读完

这张图展示了区块链生态系统的架构和主要组件。以下是对图中内容的概括总结&#xff1a; 基础层&#xff1a; 底层基础设施&#xff1a;包括光纤网络、P2P网络、非对称加密、哈希算法、默克尔树和随机数生成。共识机制&#xff1a; PoW&#xff08;工作量证明&#xff09;: 比特…

C语言笔记31 •单链表经典算法OJ题-3.反转链表•

反转链表 1.问题 给你单链表的头节点 head&#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 2.代码实现&#xff1a; //3.反转链表 #define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include <stdlib.h> #include <assert.h>typedef int …

华为模拟器ensp中USG6000V防火墙web界面使用

防火墙需要配置 新建拓扑选择USG6000V型号 在防火墙中导包 忘记截图了 启动设备 输入用户名密码 默认用户名&#xff1a;admin 默认密码&#xff1a;Admin123 修改密码 然后他会提示你是否要修改密码&#xff0c;想改就改不想改就不改 进入命令行界面 进入系统视图开启web…

【RHCE】基于用户认证和TLS加密的HTTP服务(HTTPS)

目录 一、创建用户账号 二、TLS加密 三、配置http服务子配置文件 四、创建访问http服务的文件夹以及输入重定向到文件 五、配置Linux本地仓库以及Windows下的本地仓库 六、基础操作 七、测试 一、创建用户账号 用户认证 # 创建两个账户 [rootlocalhost ~]# htpasswd -…

商业合作方案撰写指南:让你的提案脱颖而出的秘诀

作为一名策划人&#xff0c;撰写一份商业合作方案需要细致的规划和清晰的表达。 它是一个综合性的过程&#xff0c;需要策划人具备市场洞察力、分析能力和创意思维。 以下是能够帮助你撰写一份有效的商业合作方案的关键步骤和要点&#xff1a; 明确合作目标&#xff1a;设定…

网络协议(TCP三次握手,四次断开详解)

TCP的详细过程&#xff1a; TCP&#xff08;传输控制协议&#xff09;的三次握手和四次断开是其建立连接和终止连接的重要过程&#xff0c;以下是详细解释&#xff1a; 三次握手&#xff1a; 1. 第一次握手&#xff1a;客户端向服务器发送一个 SYN&#xff08;同步&#x…

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

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

火柴棒图python绘画

使用Python绘制二项分布的概率质量函数&#xff08;PMF&#xff09; 在这篇博客中&#xff0c;我们将探讨如何使用Python中的scipy库和matplotlib库来绘制二项分布的概率质量函数&#xff08;PMF&#xff09;。二项分布是统计学中常见的离散概率分布&#xff0c;描述了在固定次…

力扣 hot100 -- 动态规划(下)

目录 &#x1f4bb;最长递增子序列 AC 动态规划 AC 动态规划(贪心) 二分 &#x1f3e0;乘积最大子数组 AC 动规 AC 用 0 分割 &#x1f42c;分割等和子集 AC 二维DP AC 一维DP ⚾最长有效括号 AC 栈 哨兵 &#x1f4bb;最长递增子序列 300. 最长递增子序列…

GPT-4o不香了, Claude3.5 Sonnet来了,直接免费可用

大家好&#xff01;我是YUAN。 刚刚&#xff01; AI领域又迎来了一场新的风暴——Anthropic公司发布了全新的Claude 3.5 Sonnet模型&#xff0c;这一消息如同一颗重磅炸弹&#xff0c;震撼了整个科技界。 Claude 3.5 Sonnet与GPT-4o对比 性能飞跃&#xff1a;超越GPT-4o Cl…