Mongodb

MongoDB 字段级加密

1、简介 本文将带你了解如何使用 MongoDB 的客户端字段级加密(或 CSFLE)来加密文档中的指定字段,主要介绍显式/自动加密和显式/自动解密,以及加密算法之间的差异。 2、场景与设置 MongoDB Atlas 和 MongoDB Enterprise 都支持自动加密。MongoDB Atlas 有一个 永久免费的集群,我们可以用它来测试所有功能。 此外,需要注意的是,字段级加密有别于静态存储,后者会对整个数据库或磁盘进行加密。通过有选择地加密特定字段,我们可以更好地保护敏感数据,同时实现高效查询和索引。 本文将从一个简单的 Spring Boot 应用开始,使用 Spring Data MongoDB 插入和检索数据。 首先,我们要创建一个包含未加密字段和加密字段混合的文档类。我们将从手动加密开始,然后看看如何通过 自动加密 实现同样的效果。对于手动加密,我们需要一个中间对象来表示加密的 POJO,并创建方法来加密/解密每个字段。 2.1. Spring Boot Starter 和加解密模块 首先,需要使用 spring-boot-starter-data-mongodb 来连接到 MongoDB: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb</artifactId> </dependency> 然后,还需要 mongodb-crypt,以启用加密功能: <dependency> <groupId>org.mongodb</groupId> <artifactId>mongodb-crypt</artifactId> <version>1.7.3</version> </dependency> 由于我们使用的是 Spring Boot,所以只需上面两个依赖就足够了。 2.2、创建 Master Key Master Key(主密钥)用于加密和解密数据。任何拥有它的人都可以读取我们的数据。因此,确保主密钥的安全至关重要。 MongoDB 建议使用 远程密钥管理服务。不过,为了简单起见,本文使用本地密钥管理器,如下: public class LocalKmsUtils { public static byte[] createMasterKey(String path) { byte[] masterKey = new byte[96]; new SecureRandom().

使用 MongoDB 和 Spring AI 构建 RAG 应用

1、概览 AI(人工智能)技术的使用正成为现代开发中的一项关键技能。在本文中,我们将构建一个 RAG Wiki 应用,它可以根据存储的文档回答问题。 我们会通过 Spring AI 将应用与 MongoDB Vector 数据库 和 LLM 集成。 2、RAG 应用 当自然语言生成需要依赖上下文数据时,我们就会使用 RAG(Retrieval-Augmented Generation)应用。RAG 应用的一个关键组成部分是向量数据库(Vector Database),它在有效管理和检索这些数据方面起着至关重要的作用: 我们使用 Embedding Model 来处理源文件。Embedding Model 将文档中的文本转换为高维向量。这些向量捕捉了内容的语义,使我们能够根据上下文而不仅仅是关键词匹配来比较和检索类似的内容。然后,我们将文档存储到向量数据库。 保存文档后,我们可以通过以下方式发送提示信息: 首先,我们使用 Embedding Model 来处理问题,将其转换为捕捉其语义的向量。 接下来,进行相似性搜索,将问题的向量与存储在向量库中的文档向量进行比较。 从最相关的文档中,为问题建立一个上下文。 最后,将问题及其上下文发送给 LLM,LLM 会根据所提供的上下文构建与查询相关的回复。 3、MongoDB Atlas Search 在本教程中,我们将使用 MongoDB Atlas Search 作为我们的向量数据库。它提供的向量搜索功能可以满足我们在本项目中的需求。为了测试,我们使用 mongodb-atlas-local Docker 容器来设置 MongoDB Atlas Search 的本地实例。 创建一个 docker-compose.yml 文件: version: '3.1' services: my-mongodb: image: mongodb/mongodb-atlas-local:7.0.9 container_name: my-mongodb environment: - MONGODB_INITDB_ROOT_USERNAME=wikiuser - MONGODB_INITDB_ROOT_PASSWORD=password ports: - 27017:27017 4、依赖和配置 首先,添加必要的依赖项。由于我们的应用要提供 HTTP API,因此加入 spring-boot-starter-web 依赖:

Quarkus 整合 Mongodb

1、简介 Quarkus 是一个流行的 Java 框架,经过优化,可用于创建内存占用小、启动速度极快的应用。 与流行的 NoSQL 数据库 MongoDB 搭配使用时,Quarkus 为开发高性能、可扩展的应用提供了强大的工具包。 本文将带你了解如何使用 Quarkus 配置 MongoDB、实现基本的 CRUD 操作,以及如何使用 Quarkus 的 Panache(Object Document Mapper,ODM)来简化这些操作。 2、配置 2.1、Maven 依赖 要在 Quarkus 中使用 MongoDB,需要添加 quarkus-mongodb-client 依赖: <dependency> <groupId>io.quarkus</groupId> <artifactId>quarkus-mongodb-client</artifactId> <version>3.13.0</version> </dependency> 该依赖提供了使用 MongoDB Java 客户端与 MongoDB 数据库交互的必要工具。 2.2、运行 MongoDB 数据库 本文采用 Docker 的方式运行 MongoDB,这种方式非常便捷,无需在机器上直接安装 MongoDB。 从 Docker Hub 拉取 MongoDB 镜像: docker pull mongo:latest 启动一个新的容器: docker run --name mongodb -d -p 27017:27017 mongo:latest 2.3、配置 MongoDB 数据库 要配置的主要属性是访问 MongoDB 的 URL。我们可以在 connection 字符串中包含几乎所有的配置。

Spring Data MongoDB 构建多个条件的查询

1、简介 本文将带你了解如何使用 Spring Data JPA 在 MongoDB 中创建具有多个 Criteria(条件)的查询。 2、项目设置 首先,在 pom.xml 文件中添加 Spring Data MongoDB Starter 依赖: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb</artifactId> <version>3.3.1</version> </dependency> 通过该依赖,我们可以在 Spring Boot 项目中使用 Spring Data MongoDB 的功能。 2.1、定义 MongoDB Document 和 Repository 接下来,定义一个 MongoDB Document(文档),它是一个用 @Document 注解的 Java 类。该类映射到 MongoDB 中的一个 Collection(集合)。 例如,创建一个 Product Document: @Document(collection = "products") public class Product { @Id private String id; private String name; private String category; private double price; private boolean available; // Getter 和 Setter 方法 } 在 Spring Data MongoDB 中,我们可以创建 Repository 来定义自己的查询方法。通过注入 MongoTemplate,可以对 MongoDB 数据库执行高级操作。该类为执行查询、聚合数据和有效处理 CRUD 操作提供了丰富的方法集:

在 MongoRepository 中使用 Skip 和 Limit

1、概览 Spring Data MongoDB 的 MongoRepository 接口提供了一种简单的方式与 MongoDB Collection 进行交互。 本文将带你了解如何在 MongoRepository 中使用 limit 和 skip。 2、初始设置 首先,创建一个名为 StudentRepository 的 Repository,用于存储 Student 信息: public interface StudentRepository extends MongoRepository<Student, String> {} 然后,向该 Repository 添加一些 Student 示例数据: @Before public void setUp() { Student student1 = new Student("A", "Abraham", 15L); Student student2 = new Student("B", "Usman", 30L); Student student3 = new Student("C", "David", 20L); Student student4 = new Student("D", "Tina", 45L); Student student5 = new Student("E", "Maria", 33L); studentList = Arrays.

Spring Security 使用 Mongodb 进行认证

1. Overview Spring Security 提供了不同的身份认证系统,例如通过数据库和 UserDetailService。 有时可能不想使用 JPA 持久层,而是想使用 MongoDB Repository。本文将带你了解如何使用 Spring Security 和 MongoDB 对用户进行认证。 2、Spring Security 使用 MongoDB 进行认证 MongoDB Repository 与 JPA Repository 类似不过,我们需要设置不同的配置。 2.1、Maven 依赖 本文使用嵌入式 MongoDB。首先,添加 spring-boot-starter-data-mongodb 和 de.flapdoodle.embed.mongo 依赖: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb</artifactId> </dependency> <dependency> <groupId>de.flapdoodle.embed</groupId> <artifactId>de.flapdoodle.embed.mongo</artifactId> <version>3.3.1</version> </dependency> 2.2、配置 创建配置类: @Configuration public class MongoConfig { private static final String CONNECTION_STRING = "mongodb://%s:%d"; private static final String HOST = "localhost"; @Bean public MongoTemplate mongoTemplate() throws Exception { int randomPort = SocketUtils.

Spring Data MongoDB 开启 Debug 日志

1、概览 在使用 Spring Data MongoDB 时,可能需要比默认级别(INFO)更高的日志,以查看执行语句或查询参数等一些附加信息。 2、配置 MongoDB 查询日志 Spring Data MongoDB 通过 MongoOperations 接口或其主要的实现 MongoTemplate 来访问数据,因此只需为 MongoTemplate 类配置调 Debug 级别的日志即可。 与其他 Spring 或 Java 应用一样,可以使用日志库并为 MongoTemplate 定义日志级别。类似于如下: <logger name="org.springframework.data.mongodb.core.MongoTemplate" level="DEBUG" /> 如果是 Spring Boot 应用,可以直接在 application.properties 文件中进行配置: logging.level.org.springframework.data.mongodb.core.MongoTemplate=DEBUG 同样,也可以使用 YAML 文件: logging: level: org: springframework: data: mongodb: core: MongoTemplate: DEBUG 3、日志测试类 创建一个 Book 类: @Document(collection = "book") public class Book { @MongoId private ObjectId id; private String bookName; private String authorName; // getter 和 setter 方法 } 创建一个简单的测试类用于测试,并查看输出日志。