【Spring连载】使用Spring Data访问 MongoDB----对象映射之JSON Schema
【Spring连载】使用Spring Data访问 MongoDB----对象映射之JSON Schema
- 一、生成Schema
- 二、加密字段
- 三、JSON Schema类型
从3.6版本开始,MongoDB支持根据提供的 JSON Schema验证documents的集合。在创建集合时,可以定义schema本身以及验证操作和级别,如下例所示:
例1:示例JSON schema
{"type": "object", --------1 "required": [ "firstname", "lastname" ], --------2 "properties": { --------3 "firstname": { --------4 "type": "string","enum": [ "luke", "han" ]},"address": { --------5 "type": "object","properties": {"postCode": { "type": "string", "minLength": 4, "maxLength": 5 }}}}
}1. JSON schema documents总是从根描述整个document。schema是一个schema对象本身,它可以包含描述属性和子文档的嵌入schema对象。
2. required是一个属性,用于描述文档中需要哪些属性。可以选择性地指定它以及其他schema约束。请参阅MongoDB关于[可用关键字](https://www.mongodb.com/docs/manual/reference/operator/query/jsonSchema/#available-keywords)的文档。
3. properties与描述对象类型的schema对象相关。它包含特定于属性的schema约束。
4. firstname为document中的firstname字段指定约束。这里,它是一个基于字符串的属性元素,声明可能的字段值。
5. address是一个子文档,在其postCode字段中定义值的schema。
你可以通过指定schema document(即,通过使用Document API解析或构建document对象)或使用Spring Data的JSON schema实用程序在org.springframework.data.mongodb.core.schema中构建它来提供schema。MongoJsonSchema是所有JSON模式相关操作的入口点。下面的示例展示了如何使用MongoJsonSchema.builder()来创建JSON schema:
例2:创建JSON schema
MongoJsonSchema.builder() --------1.required("lastname") --------2.properties(required(string("firstname").possibleValues("luke", "han")), --------3object("address").properties(string("postCode").minLength(4).maxLength(5))).build(); --------41. 获取一个schema生成器,以使用fluent API配置schema。
2. 如图所示直接配置所需属性,或如第3步所示提供更多详细信息。
3. 配置所需的String类型的firstname字段,只允许使用luke和han值。属性可以是类型化的,也可以是非类型化的。使用JsonSchemaProperty的静态导入使语法稍微紧凑一点,并获取string(…)等入口点。
4. 生成schema对象。
通过gateway接口上的静态方法,已经有一些预定义的强类型schema对象(JsonSchemaObject和JsonSchemaProperty)可用。但是,你可能需要构建自定义属性验证规则,这些规则可以通过builder API创建,如下面的示例所示:
// "birthdate" : { "bsonType": "date" }
JsonSchemaProperty.named("birthdate").ofType(Type.dateType());// "birthdate" : { "bsonType": "date", "description", "Must be a date" }
JsonSchemaProperty.named("birthdate").with(JsonSchemaObject.of(Type.dateType()).description("Must be a date"));
CollectionOptions为集合提供了schema支持的入口点,如下面的示例所示:
使用$jsonSchema创建集合
MongoJsonSchema schema = MongoJsonSchema.builder().required("firstname", "lastname").build();template.createCollection(Person.class, CollectionOptions.empty().schema(schema));
一、生成Schema
建立一个schema可能是一项耗时的任务,如果想快速构建schema,可以使用JsonSchemaCreator。
JsonSchemaCreator及其默认实现生成映射基础设施提供的MongoJsonSchema域外类型元数据。这意味着,要考虑带注解的属性以及潜在的自定义转换。
例4:从域类型生成Json Schema
public class Person {private final String firstname; --------1private final int age; --------2private Species species; --------3private Address address; --------4private @Field(fieldType=SCRIPT) String theForce; --------5private @Transient Boolean useTheForce; --------6public Person(String firstname, int age) { --------1,2 this.firstname = firstname;this.age = age;}// gettter / setter omitted
}MongoJsonSchema schema = MongoJsonSchemaCreator.create(mongoOperations.getConverter()).createSchemaFor(Person.class);template.createCollection(Person.class, CollectionOptions.empty().schema(schema));
{'type' : 'object','required' : ['age'], --------2 'properties' : {'firstname' : { 'type' : 'string' },--------1 'age' : { 'bsonType' : 'int' } --------2 'species' : { --------3 'type' : 'string','enum' : ['HUMAN', 'WOOKIE', 'UNKNOWN']}'address' : { --------4 'type' : 'object''properties' : {'postCode' : { 'type': 'string' }}},'theForce' : { 'type' : 'javascript'} --------5}
}1. 简单对象属性被认为是常规属性。
2. 原始类型被认为是必需的属性,
3. 枚举被限制为可能的值。
4. 对象类型属性被检查并表示为嵌套文档。
5. 由转换器转换为代码的字符串类型属性。
6. 在生成schema时忽略@Transient属性。
_id属性使用可以转换为ObjectId的类型,如String,映射到{ type : ‘object’ },除非有更具体的信息可以通过@MongoId注解获得。
表1:特殊Schema生成规则
| Java | Schema Type | Notes |
|---|---|---|
| Object | type : object | with properties if metadata available. |
| Collection | type : array | - |
| Map | type : object | - |
| Enum | type : string | with enum property holding the possible enumeration values. |
| array | type : array | simple type array unless it’s a byte[] |
| byte[] | bsonType : binData | - |
上面的示例演示了如何从非常精确的类型源派生schema。在域模型中使用多态元素可能导致Object和泛型<T>类型的模式表示不准确,它们很可能表示为{ type : ‘object’ },而没有进一步的说明。MongoJsonSchemaCreator.property(…)允许定义额外的细节,比如在呈现schema时应该考虑的嵌套文档类型。
例5:为属性指定其他类型
class Root {Object value;
}class A {String aValue;
}class B {String bValue;
}
MongoJsonSchemaCreator.create().property("value").withTypes(A.class, B.class) --------1
{'type' : 'object','properties' : {'value' : {'type' : 'object','properties' : { --------1 'aValue' : { 'type' : 'string' },'bValue' : { 'type' : 'string' }}}}
}1. 给定类型的属性被合并到一个元素中。
MongoDB的schema-free方法允许在一个集合中存储不同结构的文档。它们可以被建模为具有公共基类。无论选择哪种方法,MongoJsonSchemaCreator.merge(…)都可以帮助满足将多个schema合并为一个schema的需要。
例6:将多个Schemas合并到单个Schema定义中
abstract class Root {String rootValue;
}class A extends Root {String aValue;
}class B extends Root {String bValue;
}MongoJsonSchemaCreator.mergedSchemaFor(A.class, B.class) --------1
{'type' : 'object','properties' : { --------1'rootValue' : { 'type' : 'string' },'aValue' : { 'type' : 'string' },'bValue' : { 'type' : 'string' }}}
}1. 给定类型的属性(及其继承的属性)被组合到一个schema中。
具有相同名称的属性需要引用相同的JSON schema才能进行组合。下面的示例展示了由于数据类型不匹配而无法自动合并的定义。在这种情况下,一个ConflictResolutionFunction必须提供给MongoJsonSchemaCreator。
class A extends Root {String value;
}class B extends Root {Integer value;
}
二、加密字段
MongoDB 4.2字段级加密允许直接加密单个属性。
设置JSON Schema时,可以将属性封装在加密的属性中,如下例所示。
例7:通过Json Schema进行客户端字段级加密
MongoJsonSchema schema = MongoJsonSchema.builder().properties(encrypted(string("ssn")).algorithm("AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic").keyId("*key0_id")).build();
如果不想手动定义加密字段,可以利用@Encrypted注解,如下面的代码片段所示。
例8:通过Json Schema进行客户端字段级加密
@Document
@Encrypted(keyId = "xKVup8B1Q+CkHaVRx+qa+g==", algorithm = "AEAD_AES_256_CBC_HMAC_SHA_512-Random") --------1
static class Patient {@Id String id;String name;@Encrypted --------2String bloodType;@Encrypted(algorithm = "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic") --------3Integer ssn;
}1. 将为encryptMetadata设置默认的加密设置。
2. 使用默认加密设置的加密字段。
3. Encrypted字段覆盖默认加密算法。
@Encrypted注解支持通过SpEL表达式解析keyIds。为此,需要提供额外的环境元数据(通过MappingContext)。
@Document
@Encrypted(keyId = "#{mongocrypt.keyId(#target)}")
static class Patient {@Id String id;String name;@Encrypted(algorithm = "AEAD_AES_256_CBC_HMAC_SHA_512-Random")String bloodType;@Encrypted(algorithm = "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic")Integer ssn;
}MongoJsonSchemaCreator schemaCreator = MongoJsonSchemaCreator.create(mappingContext);
MongoJsonSchema patientSchema = schemaCreator.filter(MongoJsonSchemaCreator.encryptedOnly()).createSchemaFor(Patient.class);
mongocrypt.keyId函数是通过EvaluationContextExtension定义的,如下面的代码片段所示。提供自定义扩展提供了计算keyIds的最灵活的方法。
public class EncryptionExtension implements EvaluationContextExtension {@Overridepublic String getExtensionId() {return "mongocrypt";}@Overridepublic Map<String, Function> getFunctions() {return Collections.singletonMap("keyId", new Function(getMethod("computeKeyId", String.class), this));}public String computeKeyId(String target) {// ... lookup via target element name}
}
三、JSON Schema类型
相关文章:
【Spring连载】使用Spring Data访问 MongoDB----对象映射之JSON Schema
【Spring连载】使用Spring Data访问 MongoDB----对象映射之JSON Schema 一、生成Schema二、加密字段三、JSON Schema类型 从3.6版本开始,MongoDB支持根据提供的 JSON Schema验证documents的集合。在创建集合时,可以定义schema本身以及验证操作和级别&…...
用于游戏开发的顶级 PYTHON 框架
一、说明 我们试图用python开发游戏,一旦产生这个念头,就伴随这样一个问题:当今用于构建游戏的领先 Python 框架有哪些?python下,支持游戏开发平台有哪些优势?我们在这篇博文中告诉你。 二、高级游戏平台简…...
【MongoDB】docker安装mongodb 7.0
下载镜像 docker pull mongo创建本地数据存储文件夹 rootxrx:~/etc# tree mongodb/ mongodb/ └── data使用docker创建容器,并挂载配置文件,并设置密码 docker run -p 5233:27017 -v /root/etc/mongodb/data:/data/db --name mongo -e MONGO_INITDB_ROOT_USERNAMEroot -…...
win10安全中心误删文件怎么办?解析恢复与预防策略
在使用Windows 10的过程中,许多用户依赖于其内置的安全中心来保护电脑免受恶意软件的侵害。然而,有时安全中心的误判可能导致重要文件被错误地删除。当面对这种情况时,了解如何恢复误删的文件并掌握预防措施显得尤为重要。本文将为您详细解析…...
如何锁定MYSQL内存在物理内存里?
MYSQL 8.0 这个参数是 OFF 这个参数是啥意思呢? 按英文单词理解是 锁定在内存意思.突然想起来是因为 周报巡检时主库有使用SWAP内存 而从库却使用更多 使用脚本查看SWAP 进程排序 for i in cd /proc;ls |grep "^[0-9]"|awk $0 >100 ;do awk /Swap:/{aa$2} EN…...
vue菜单栏跳转方案
vue菜单栏跳转方案 <template><div><el-container style"height: 100vh"><el-aside width"200px" style"background-color: #b3c0d1"><el-menuopen"handleOpen"close"handleClose"select"h…...
科技企业如何做到FTP数据安全保护
在数字化浪潮的推动下,科技企业的数据已成为推动创新、提升效率、增强竞争力的核心资源。数据的重要性不言而喻,它不仅包含了客户信息、市场分析、产品设计等关键信息,更是企业宝贵的资产。然而,随着数据量的激增,数据…...
Ubuntu服务器fail2ban的使用
作用:限制ssh远程登录,防止被人爆破服务器,封禁登录ip 使用lastb命令可查看到登录失败的用户及ip,无时无刻的不在爆破服务器 目录 一、安装fail2ban 二,配置fail2ban封禁ip的规则 1,进入目录并创建ssh…...
全量知识系统问题及SmartChat给出的答复 之10 三套工具之5语法解析器之3
Q27. 从前面可以看出,IPP解析器给出两种文法规则,一种是人工的(文字处理和文本理解),一种是机器的(图形算法和图像处理)。前者可以是一套文写文章的注释工具的底层,可以使用颜色来着…...
【leetcode】环形链表✚环形链表II
大家好,我是苏貝,本篇博客带大家刷题,如果你觉得我写的还不错的话,可以给我一个赞👍吗,感谢❤️ 目录 1.环形链表解题拓展: 2.环形链表II 1.环形链表 点击查看题目 解题 思路: bool hasCycle…...
SparkStreaming在实时处理的两个场景示例
简介 Spark Streaming是Apache Spark生态系统中的一个组件,用于实时流式数据处理。它提供了类似于Spark的API,使开发者可以使用相似的编程模型来处理实时数据流。 Spark Streaming的工作原理是将连续的数据流划分成小的批次,并将每个批次作…...
02点亮一个LED
书接上回 上回讲到创建一个示例工程 今天讲如何实现LED的点亮 点亮一个led 所需代码 参考来源网络 延时函数参考: Delay.c #include "stm32f10x.h"/*** brief 微秒级延时* param xus 延时时长,范围:0~233015* retval 无*/ vo…...
【代码分享】
//插入排序 void lnsertionSort(int a[], int n) { int end 0; int tmp 0; int i 0; for (i 0;i < n - 1; i) { end i; tmp a[end 1]; while (end > 0) { if (a[end] > tmp) { a[end 1] a[end]; end–; } else { break; } } a[end 1] tmp; } } //希尔排序…...
windows 使用ffmpeg .a静态库:读取Wav音频并保存PCM
ffmpeg读取Wav音频并保存PCM(源代码保存成 c 文件): // test_ffmpeg.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。 ////#include <iostream>#include <libavcodec/avcodec.h> #include <libavform…...
Docker部署ZooKeeper
在分布式系统中,ZooKeeper是一个关键的组件,用于协调和管理多个节点之间的状态。本文将详细介绍如何使用Docker安装和部署ZooKeeper,包括非集群部署和集群部署两种情况。 非集群部署 前期准备 在开始之前,请确保你已经安装了Docker,并且拥有sudo权限。 关闭防火墙和SEL…...
在PyCharm中使用Git
安装Git CMD检查Git版本 打开cmd,输入git version,检查当前下载版本 配置git的user信息 在cmd中输入 git config --global user.name "用户名"git config --global user.email "用户邮箱"输入:git config --list&…...
【JavaSE】 P165 ~ P194 抽象方法,抽象类,接口,接口内容,多接口实现和父类继承,多态,向上转型,向下转型
目录 抽象抽象的概念抽象方法和抽象类的格式抽象方法和抽象类的使用抽象方法和抽象类的注意事项● 练习1. 写一个父类图形类,其中有方法,功能计算面积为抽象方法。2. 抽象类继承。判断对错,没错的分析运行结果3. 发红包,群内用户类作为父类,有…...
LeetCode: 数组中的第K个最大元素
问题描述 在未排序的数组中找到第k个最大的元素。请注意,你需要找的是数组排序后的第k个最大的元素,而不是第k个不同的元素。 解题思路 解决这个问题有多种方法,下面是几种常见的解题策略: 排序后选择: 将数组排序,…...
亚马逊自养号测评:如何安全搭建环境,有效规避风险
要在亚马逊上进行自养号测评,构建一个真实的国外环境至关重要。这包括模拟国外的服务器、IP地址、浏览器环境,甚至支付方式,以创建一个完整的国际操作环境。这样的环境能让我们自由注册、养号并下单,确保所有操作均符合国际规范。…...
uniApp 调整小程序 单个/全部界面横屏展示效果
我们打开uni项目 小程序端运行 默认是竖着的一个效果 我们打开项目的 pages.json 给需要横屏的界面 的 style 属性 加上 "mp-weixin": {"pageOrientation": "landscape" }界面就横屏了 如果是要所有界面都横屏的话 就直接在pages.json 的 gl…...
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造,完美适配AGV和无人叉车。同时,集成以太网与语音合成技术,为各类高级系统(如MES、调度系统、库位管理、立库等)提供高效便捷的语音交互体验。 L…...
java_网络服务相关_gateway_nacos_feign区别联系
1. spring-cloud-starter-gateway 作用:作为微服务架构的网关,统一入口,处理所有外部请求。 核心能力: 路由转发(基于路径、服务名等)过滤器(鉴权、限流、日志、Header 处理)支持负…...
QMC5883L的驱动
简介 本篇文章的代码已经上传到了github上面,开源代码 作为一个电子罗盘模块,我们可以通过I2C从中获取偏航角yaw,相对于六轴陀螺仪的yaw,qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...
visual studio 2022更改主题为深色
visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中,选择 环境 -> 常规 ,将其中的颜色主题改成深色 点击确定,更改完成...
1688商品列表API与其他数据源的对接思路
将1688商品列表API与其他数据源对接时,需结合业务场景设计数据流转链路,重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点: 一、核心对接场景与目标 商品数据同步 场景:将1688商品信息…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序
一、开发准备 环境搭建: 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 项目创建: File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...
【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力
引言: 在人工智能快速发展的浪潮中,快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型(LLM)。该模型代表着该领域的重大突破,通过独特方式融合思考与非思考…...
【C++特殊工具与技术】优化内存分配(一):C++中的内存分配
目录 一、C 内存的基本概念 1.1 内存的物理与逻辑结构 1.2 C 程序的内存区域划分 二、栈内存分配 2.1 栈内存的特点 2.2 栈内存分配示例 三、堆内存分配 3.1 new和delete操作符 4.2 内存泄漏与悬空指针问题 4.3 new和delete的重载 四、智能指针…...
通过MicroSip配置自己的freeswitch服务器进行调试记录
之前用docker安装的freeswitch的,启动是正常的, 但用下面的Microsip连接不上 主要原因有可能一下几个 1、通过下面命令可以看 [rootlocalhost default]# docker exec -it freeswitch fs_cli -x "sofia status profile internal"Name …...
vue3 daterange正则踩坑
<el-form-item label"空置时间" prop"vacantTime"> <el-date-picker v-model"form.vacantTime" type"daterange" start-placeholder"开始日期" end-placeholder"结束日期" clearable :editable"fal…...
