【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) {        --------12 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生成規則

JavaSchema TypeNotes
Objecttype : objectwith properties if metadata available.
Collectiontype : array-
Maptype : object-
Enumtype : stringwith enum property holding the possible enumeration values.
arraytype : arraysimple 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類型

下表展示了支持的JSON schema類型:
支持的JSON schema類型

Schema TypeJava TypeSchema Properties
untyped-description, generated description, enum, allOf, anyOf, oneOf, not
objectObjectrequired, additionalProperties, properties, minProperties, maxProperties, patternProperties
arrayany array except byte[]uniqueItems, additionalItems, items, minItems, maxItems
stringStringminLength, maxLentgth, pattern
intint, IntegermultipleOf, minimum, exclusiveMinimum, maximum, exclusiveMaximum
longlong, LongmultipleOf, minimum, exclusiveMinimum, maximum, exclusiveMaximum
doublefloat, Float, double, DoublemultipleOf, minimum, exclusiveMinimum, maximum, exclusiveMaximum
decimalBigDecimalmultipleOf, minimum, exclusiveMinimum, maximum, exclusiveMaximum
numberNumbermultipleOf, minimum, exclusiveMinimum, maximum, exclusiveMaximum
binDatabyte[](none)
booleanboolean, Boolean(none)
nullnull(none)
objectIdObjectId(none)
datejava.util.Date(none)
timestampBsonTimestamp(none)
regexjava.util.regex.Pattern(none)

untyped是由所有類型化schema類型繼承的泛型類型。它將所有untyped schema屬性提供給類型化schema類型。
有關更多信息,請參閱$jsonSchema。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/714647.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/714647.shtml
英文地址,請注明出處:http://en.pswp.cn/news/714647.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Python爬蟲Cookies 池的搭建

Cookies 池的搭建 很多時候&#xff0c;在爬取沒有登錄的情況下&#xff0c;我們也可以訪問一部分頁面或請求一些接口&#xff0c;因為畢竟網站本身需要做 SEO&#xff0c;不會對所有頁面都設置登錄限制。 但是&#xff0c;不登錄直接爬取會有一些弊端&#xff0c;弊端主要有…

南京師范大學計電院數據結構課設——排序算法

1 排序算法 1.1 題目要求 編程實現希爾、快速、堆排序、歸并排序算法。要求首先隨機產生10000個數據存入磁盤文件&#xff0c;然后讀入數據文件&#xff0c;分別采用不同的排序方法進行排序并將結果存入文件中。 1.2 算法思想描述 1.2.1 隨機數生成 當需要生成一系列隨機數…

windows 11 前后端項目部署

目錄 1.準備環境&#xff1a; 2.安裝jdk 測試&#xff1a;winr 輸入cmd 3.安裝tomcat 4.安裝mysql 遠程導入數據&#xff1a; 外部后臺訪問&#xff1a;192.168.232.1:8080/crm/sys/loginAction.action?usernamezs&password123 5.安裝nginx 前后端部署&#xff1…

qsort函數的模擬實現(冒泡排序模擬)

冒泡排序&#xff1a; 從第一個元素開始&#xff0c;依次比較相鄰的兩個元素&#xff0c;如果順序不對就交換它們。 經過一輪遍歷后&#xff0c;最大&#xff08;或最小&#xff09;的元素會排在最后。 重復進行上述步驟&#xff0c;直到沒有任何元素需要交換&#xff0c;即…

Linux了解

簡介 Linux是一種自由和開放源代碼的類UNIX操作系統&#xff0c;由芬蘭的Linus Torvalds于1991年首次發布。Linux最初是作為支持英特爾x86架構的個人電腦的一個自由操作系統&#xff0c;現在已經被移植到更多的計算機硬件平臺&#xff0c;如手機、平板電腦、路由器、視頻游戲控…

爬蟲入門到精通_實戰篇8(分析Ajax請求并抓取今日頭條美食美圖)_界面上抓取Ajax方式

1 目標 目標&#xff1a; 抓取今日頭條美食美圖&#xff0c;如下&#xff1a; 一些網頁直接請求得到的HTML代碼并沒有在網頁中看到的內容&#xff0c;因為一些信息是通過Ajax加載&#xff0c;并通過js渲染生成的&#xff0c;這時就需要通過分析網頁的請求來獲取想要爬取的內容…

解決conda環境下import TensorFlow失敗的問題

問題描述 安裝了anaconda的電腦&#xff0c;新建了一個名叫deeplearning的環境&#xff0c;在該環境下已經成功安裝了tensorflow。 于是在終端打開python并執行代碼 import tensorflow as tf print(1)除了提示 2024-02-27 21:50:00.801427: I external/local_tsl/tsl/cuda/c…

CSS 盒子模型(box model)

概念 所有HTML元素可以看作盒子&#xff0c;在CSS中&#xff0c;"box model"這一術語是用來設計和布局時使用CSS盒模型本質上是一個盒子&#xff0c;封裝周圍的HTML元素&#xff0c;它包括&#xff1a;外邊距(margin)&#xff0c;邊框(border)&#xff0c;內邊距(pad…

關于 HTTP 協議,你了解多少

HTTP協議 FastAPI 是建立在 HTTP 協議之上&#xff0c;所以為了更好的掌握 FastAPI。我們需要先簡單的了解一下 HTTP協議 簡介 HTTP&#xff08;Hypertext Transfer Protocol&#xff09;遵循經典的客戶端-服務器模型&#xff0c;客戶端打開連接以發出請求&#xff0c;然后等…

【Go語言】Go語言中的流程控制

Go語言中的流程控制 流程控制主要用于設定計算執行的順序&#xff0c;簡歷程序的邏輯結果&#xff0c;Go語言的流程控制語句與其他語言類似&#xff0c;支持如下幾種流程控制語句&#xff1a; 條件語句&#xff1a;用于條件判斷&#xff0c;對應的關鍵字有if、else和else if&a…

SQL 語句的執行順序

數據庫引擎在執行SQL語句并不是從SELECT開始執行&#xff0c;而是從FROM開始&#xff0c;執行順序如下(關鍵字前面的數字代表SQL執行的順序步驟)&#xff1a; ⑧SELECT ⑨DISTINCT ⑩①【Top Num】 【select list】 ①FROM {left_table_name} ③【join_type】 JOIN {righ…

vuecli配置sass

vuecli5如何配置sass sass有很多優勢&#xff0c;可以減少css重復&#xff0c;提高效率等&#xff0c;本人使用了 vuecli5 node -v 查看node版本根據版本安裝node-sass sass-loader 如我的版本“node-sass”: “^4.14.1”,“sass-loader”: “^7.1.0”,node -vv14.15.0&#…

使用 Docker 部署 Fiora 在線聊天室平臺

一、Fiora 介紹 Fiora 簡介 Fiora 是一款開源免費的在線聊天系統。 GitHub&#xff1a;https://github.com/yinxin630/fiora Fiora 功能 注冊賬號并登錄&#xff0c;可以長久保存你的數據加入現有群組或者創建自己的群組&#xff0c;來和大家交流和任意人私聊&#xff0c;并添…

MySQL 主從讀寫分離入門——基本原理以及ProxySQL的簡單使用

一、讀寫分離工作原理 讀寫分離的工作原理&#xff1a;在大型網站業務中&#xff0c;當單臺數據庫無法滿足并發需求時&#xff0c;通過主從同步方式同步數據。設置一臺主服務器負責增、刪、改&#xff0c;多臺從服務器負責查詢&#xff0c;從服務器從主服務器同步數據以保持一…

C語言數據結構——隊列

目錄 0.前言 1.隊列的基本概念 2.隊列的實現 2.1實現方式 2.2具體實現 3.隊列的應用場景 4.一道隊列的算法題&#xff08;LeetCode225. 用隊列實現棧&#xff09; 5.結語 &#xff08;圖像由AI生成&#xff09; 0.前言 在計算機科學領域&#xff0c;數據結構是組織和…

Linux篇: 進程控制

一、進程創建 1.1 fork函數初識 在Linux中&#xff0c;fork函數是非常重要的函數&#xff0c;它從已存在進程中創建一個新進程。新進程為子進程&#xff0c;而原進程為父進程。 返回值&#xff1a; 在子進程中返回0&#xff0c;父進程中返回子進程的PID&#xff0c;子進程創…

OSI七層模型/TCP四層模型

協議&#xff1a; 協議是雙方共同指定的一組規則&#xff0c;在網絡通信中表示通信雙方傳遞數據和解釋數據的一組規則。 從A上傳文件到服務器B,需要在A和B之間制定一個雙方都認可的規則&#xff0c;這個規則就叫文件傳輸協議&#xff0c;該協議是ftp協議的一個初級版本&#…

LeetCode 刷題 [C++] 第226題.翻轉二叉樹

題目描述 給你一棵二叉樹的根節點 root &#xff0c;翻轉這棵二叉樹&#xff0c;并返回其根節點。 題目分析 深度優先搜索&#xff08;DFS&#xff09;- 遞歸方式 對于二叉樹的鏡像問題&#xff0c;很容易想到的就是使用遞歸來解決&#xff0c;自底向上依次翻轉每一個節點…

2024年騰訊云優惠券領取頁面_代金券使用方法_新老用戶均可

騰訊云代金券領取渠道有哪些&#xff1f;騰訊云官網可以領取、官方媒體賬號可以領取代金券、完成任務可以領取代金券&#xff0c;大家也可以在騰訊云百科蹲守代金券&#xff0c;因為騰訊云代金券領取渠道比較分散&#xff0c;騰訊云百科txybk.com專注匯總優惠代金券領取頁面&am…

『大模型筆記』Sora:探索大型視覺模型的前世今生、技術內核及未來趨勢

Sora:探索大型視覺模型的前世今生、技術內核及未來趨勢 文章目錄 一. 摘要二. 引言楊立昆推薦的關于世界模型的真正含義(或應該是什么)的好文章。原文:Sora: A Review on Background, Technology, Limitations, and Opportunities of Large Vision Models譯文:Sora探索大型…