当前位置: 首页 > news >正文

【Spring连载】使用Spring Data访问 MongoDB(二)----Template API

【Spring连载】使用Spring Data访问 MongoDB(二)----Template API

  • 一、方便的方法
  • 二、执行回调函数Execute Callbacks
  • 三、Fluent API
  • 四、异常转换
  • 五、域类型映射
  • 六、配置
    • 6.1 默认读取首选项Read Preference
    • 6.2 WriteResultChecking策略
    • 6.3 默认写安全WriteConcern
    • 6.4 WriteConcernResolver
    • 6.5 发布实体生命周期事件
    • 6.6 配置EntityCallbacks
    • 6.7 Document count配置
  • 七、索引及集合管理
  • 八、保存、更新和删除Documents
  • 九、查询Documents
    • 9.1 查询集合中的Documents
    • 9.2 选择字段
    • 9.3 其他查询选项
      • 9.3.1 Hints
      • 9.3.2 游标批大小Cursor Batch Size
      • 9.3.3 Collations
      • 9.3.4 读取首选项Read Preference
      • 9.3.5 Comments
  • 十、Counting Documents
  • 十一、聚合(Aggregation)框架支持

MongoTemplate及其反应式(reactive)对应类位于org.springframework.data.mongodb.core包中,是Spring MongoDB支持的中心类,为与数据库交互提供了丰富的功能集。该template提供了创建、更新、删除和查询MongoDB文档的方便操作,并提供了域对象和MongoDB documents之间的映射。
配置后,MongoTemplate是线程安全的,可以在多个实例中重用。

一、方便的方法

MongoTemplate类实现了MongoOperations接口。在尽可能多的情况下,MongoOperations上的方法以MongoDB driver Collection对象上可用的方法命名,以便让现有使用driver API的MongoDB开发人员熟悉。例如,你可以找到find, findAndModify, findAndReplace, findOne, insert, remove, save, update, 和 updateMulti等方法。设计目标是尽可能容易地在使用基础MongoDB driver和MongoOperations之间进行转换。这两个API之间的主要区别在于,MongoOperations可以传递域对象,而不是Document。此外,MongoOperations为Query, Criteria, 和 Update操作提供了流畅的API,而不是填充Document来指定这些操作的参数。
有关更多信息,请参阅文档的CRUD(章节八、九)部分。
引用MongoTemplate实例上的操作的首选方式是通过其接口MongoOperations。

二、执行回调函数Execute Callbacks

MongoTemplate提供了许多方便的方法来帮助你轻松执行常见任务。但是,如果你需要直接访问MongoDB driver API,可以使用几种Execute回调方法之一。execute回调为你提供了对MongoCollection或MongoDatabase对象的引用。

  • < T> T execute (Class<?> entityClass, CollectionCallback< T> action):为指定类的实体集合运行给定的CollectionCallback。
  • < T> T execute (String collectionName, CollectionCallback action):在给定名称的集合上运行给定的CollectionCallback。
  • < T> T execute (DbCallback action):运行DbCallback,根据需要转换任何异常。Spring Data MongoDB为MongoDB 2.2版引入的聚合(Aggregation)框架提供了支持。
  • < T> T execute (String collectionName, DbCallback< T> action):在给定名称的集合上运行DbCallback,根据需要转换任何异常。
  • < T> T executeInSession (DbCallback< T> action):在与数据库的同一连接中运行给定的DbCallback,以确保写操作繁重的环境中的一致性,在这里你可能读取你所写的数据。
    以下示例使用CollectionCallback返回有关索引的信息:
boolean hasIndex = template.execute("geolocation", collection ->Streamable.of(collection.listIndexes(org.bson.Document.class)).stream().map(document -> document.get("name")).anyMatch("location_2d"::equals)
);

三、Fluent API

作为与MongoDB进行更低级交互的核心组件,MongoTemplate提供了广泛的方法,涵盖了从集合创建、索引创建和CRUD操作到更高级的功能(如Map Reduce和聚合)的需求。你可以为每个方法找到多个重载。其中大多数涉及API的可选的或可为null的部分。
FluentMongoOperations为MongoOperations的常见方法提供了一个更窄的接口,并提供了更易读、更流畅的API。入口点(insert(…), find(…), update(…), 和其他)遵循基于要运行的操作的自然命名模式。从入口点(entry point)来看,API设计为仅提供依赖于上下文的方法,这些方法会导致调用实际MongoOperations对应方的终止方法 — 在以下示例的情况下使用all方法:

List<Jedi> all = template.query(SWCharacter.class) --------1.inCollection("star-wars")                       --------2.as(Jedi.class)                                  --------3.matching(query(where("jedi").is(true)))         --------4.all();1. 用于将查询中使用的字段映射到的类型。
2. 如果未在域类型上定义,则要使用的集合名称。
3. 如果未使用原始域类型,则用此结果类型。
4. 查找查询。

使用投影(projections)允许MongoTemplate通过将实际响应限制在投影目标类型所需的字段来优化结果映射。只要查询本身不包含任何字段限制,并且目标类型是closed接口或DTO投影,这一点就适用。
投影不得应用于DBRefs。
你可以通过终止(terminating)方法在检索单个实体和检索多个实体之间切换,作为List或Stream :first(), one(), all(), 或 stream()。
当使用near(NearQuery)编写地理空间查询时,终止(terminating)方法的数量会更改为仅包括对在MongoDB中运行geoNear命令有效的方法(在GeoResults中获取GeoResult实体),如下例所示:

GeoResults<Jedi> results = template.query(SWCharacter.class).as(Jedi.class).near(alderaan) // NearQuery.near(-73.9667, 40.78).maxDis….all();

四、异常转换

Spring框架为各种各样的数据库和映射技术提供了异常转换。这在传统上是JDBC和JPA的功能。Spring对MongoDB的支持通过提供“org.springframework.dao.support.PersistenceExceptionTranslator”接口的实现,将此功能扩展到MongoDB数据库。
映射到与Spring一致的数据访问异常层次结构背后的动机是,你可以编写可移植的描述性异常处理代码,而无需针对MongoDB错误代码进行编码。Spring的所有数据访问异常都是从根DataAccessException类继承的,因此你可以确保在单个try-catch块中捕获所有与数据库相关的异常。请注意,并不是所有由MongoDB driver抛出的异常都继承自MongoException类。内部异常和消息将被保留,因此不会丢失任何信息。
MongoExceptionTranslator执行的一些映射是“com.mongodb.Network”到DataAccessResourceFailureException,以及MongoException错误代码1003、12001、12010、12011和12012到InvalidDataAccessApiUsageException。查看实现以获取有关映射的更多详细信息。

五、域类型映射

MongoDB documents和域类之间的映射是通过委托给MongoConverter接口的实现来完成的。Spring提供了MappingMongoConverter,但是你也可以编写自己的转换器。虽然MappingMongoConverter可以使用额外的元数据来指定对象到documents的映射,但它也可以通过使用一些用于IDs和集合名称映射的约定来转换不包含额外元数据的对象。这些约定以及映射注解的使用将在对象映射一文中进行解释。

六、配置

你可以使用以下配置来创建和注册MongoTemplate的实例,如下例所示:
基于Java的注册MongoClient对象并启用Spring的异常转换支持

@Configuration
class ApplicationConfiguration {@BeanMongoClient mongoClient() {return MongoClients.create("mongodb://localhost:27017");}@BeanMongoOperations mongoTemplate(MongoClient mongoClient) {return new MongoTemplate(mongoClient, "geospatial");}
}

基于XML的注册MongoClient对象

<mongo:mongo-client host="localhost" port="27017" /><bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate"><constructor-arg ref="mongoClient" /><constructor-arg name="databaseName" value="geospatial" />
</bean>

MongoTemplate和ReactiveMongoTemplate有几个重载构造函数:

  • MongoTemplate(MongoClient mongo, String databaseName):使用MongoClient对象和默认的数据库名称进行操作。
  • MongoTemplate(MongoDatabaseFactory mongoDbFactory):采用一个mongoDbFactory对象,该对象封装了MongoClient对象、数据库名称以及用户名和密码。
  • MongoTemplate(MongoDatabaseFactory mongoDbFactory, MongoConverter mongoConverter):添加一个MongoConverter用于映射。

在创建MongoTemplate/ReactiveMongoTemplate时,你可能希望设置的其他可选属性包括默认的WriteResultCheckingPolicy、WriteConcern、ReadPreference和下面列出的其他属性。

6.1 默认读取首选项Read Preference

如果没有通过查询定义其他首选项(9.3.4 读取首选项Read Preference),则将使用默认读取首选项用于读取操作。

6.2 WriteResultChecking策略

6.3 默认写安全WriteConcern

6.4 WriteConcernResolver

6.5 发布实体生命周期事件

6.6 配置EntityCallbacks

6.7 Document count配置

七、索引及集合管理

八、保存、更新和删除Documents

九、查询Documents

9.1 查询集合中的Documents

9.2 选择字段

9.3 其他查询选项

9.3.1 Hints

9.3.2 游标批大小Cursor Batch Size

9.3.3 Collations

9.3.4 读取首选项Read Preference

9.3.5 Comments

十、Counting Documents

十一、聚合(Aggregation)框架支持

相关文章:

【Spring连载】使用Spring Data访问 MongoDB(二)----Template API

【Spring连载】使用Spring Data访问 MongoDB&#xff08;二&#xff09;----Template API 一、方便的方法二、执行回调函数Execute Callbacks三、Fluent API四、异常转换五、域类型映射六、配置6.1 默认读取首选项Read Preference6.2 WriteResultChecking策略6.3 默认写安全Wri…...

手写table表格(一表头多数据)

手写table表格&#xff08;一表头多数据&#xff09; <template><div class"table-info"><div class"info-list"><div class"header-wrapper"><div class"columns-title" v-for"(i, k) in columns&q…...

python3 flask 实现对config.yaml文件的内容的增删改查,并重启服务

config.yaml配置文件内容 功能就是userpass下的用户名和密码做增删改查&#xff0c;并重启hy2服务 auth:type: userpassuserpass:csdn: csdnlisten: :443 masquerade:proxy:rewriteHost: trueurl: https://www.bing.com/type: proxy tls:cert: /root/hyst*****马赛克******er…...

ADO世界之“对象”

目录 一、Command 对象 1.Command 对象 2.语法 3.属性 4.方法 5.集合 二、Connection 对象 1.Connection 对象 2.语法 3.属性 4.方法 5.事件 6.集合 三、Error 对象 1.Error 对象 2.语法 3.属性 四、Parameter 对象 1.Field 对象 2.语法 3.属性 4.方法 …...

LeetCode59-螺旋矩阵II

参考链接&#xff1a;代码随想录->螺旋矩阵II 关键是学视频链接里面的编码思想&#xff0c;然后背下来 class Solution { public:vector<vector<int>> generateMatrix(int n) {vector<vector<int>> resvector(n,vector<int>(n,0));int sx0,s…...

MySQL 索引原理以及 SQL 优化

索引 索引&#xff1a;一种有序的存储结构&#xff0c;按照单个或者多个列的值进行排序。索引的目的&#xff1a;提升搜索效率。索引分类&#xff1a; 数据结构 B 树索引&#xff08;映射的是磁盘数据&#xff09;hash 索引&#xff08;快速锁定内存数据&#xff09;全文索引 …...

C++学习Day08之函数模板和普通函数的区别以及调用规则

目录 一、程序及输出1.1 区别1.1.1 自动类型推导&#xff0c;不可以发生隐式类型转换的1.1.2 普通函数 可以发生隐式类型转换 1.2 调用规则 二、分析与总结 一、程序及输出 1.1 区别 1.1.1 自动类型推导&#xff0c;不可以发生隐式类型转换的 1.1.2 普通函数 可以发生隐式类型…...

Kaggle实践之《Home Credit Default Risk》的逐步优化

记录下每一次的改进及其score。 1、只用训练集的特征简单处理 特征只用训练集的特征&#xff0c;把string型的特征全部进行one-hot转化&#xff0c;然后随机1:4分成测试集训练集&#xff0c;模型也调参直接出结果。 最终的score是训练集80.13%、验证集76.33%、线上74.28%。 …...

django rest framework 学习笔记-实战商城2

01收货地址模型类和视图定义_哔哩哔哩_bilibili 本博客借鉴至大佬的视频学习笔记 地址信息的管理&#xff1a;增删改查的实现 # 序列化器配置 class AddrSerializer(serializers.ModelSerializer):"""收货地址的模型序列化器"""class Meta:mo…...

WEB 3D技术 three.js 3D贺卡(4) 添加鼠标滚轮移动屏幕 改变贺卡文字功能

好&#xff0c;上文 WEB 3D技术 three.js 3D贺卡(3) 点光源灯光动画效果 那么 我们来做一下 鼠标滚动相机和滚动时不同文字的切换 首先 我们要设置多个场景 其实也不能完全叫场景 也可以说多个位置 反正简单说就是多个位置 展现多个场景 我们先在代码的最下面 加上一个对象数…...

爬虫在网页抓取的过程中可能会遇到哪些问题?

在网页抓取&#xff08;爬虫&#xff09;过程中&#xff0c;开发者可能会遇到多种问题&#xff0c;以下是一些常见问题及其解决方案&#xff1a; 1. IP封锁&#xff1a; 问题&#xff1a;封IP是最常见的问题&#xff0c;抓取的目标网站会识别并封锁频繁请求的IP地址。 解决方案…...

Eclipse中Run As On Server和Run As Java Application

一、名词释义 run java application &#xff08;作为Java应用程序运行&#xff09;是运行 java main方法。 run on server是启动一个web 应用服务器。 二、两者的区别 Eclipse中可以创建java project 也可以创建java web poject 。java project是可以直接在命令行运行,或者…...

【MySQL】库的操作——MySQL数据库 、库的操作、表的操作、字符集和校验规则、备份和恢复

文章目录 MySQL1. 库的操作2. 表的操作3. 字符集和校验规则3.1 查看系统默认字符集以及校验规则3.2 查看数据库支持的字符集3.3 查看数据库支持的字符集校验规则 4. 备份和恢复4.1 备份4.2 还原 MySQL 1. 库的操作 连接服务器 mysql -h 127.0.0.1 -P 3306 -u root -pmysql -u…...

pytorch 用F.normalization的逆归一化如何操作

逆归一化的时候再把这个数乘回去就行了 magnitude a.norm(p2, dim1, keepdimTrue) # NEW atorch.nn.functional.normalize(a, p2, dim1) a_or a* magnitude # NEW print(a_or) Outputs: tensor([]1,2,3)...

LabVIEW多通道压力传感器实时动态检测

LabVIEW多通道压力传感器实时动态检测 介绍了一种基于LabVIEW的多通道压力传感器实时动态检测系统&#xff0c;解决压阻式压力传感器温度补偿过程的复杂度&#xff0c;提高测量的准确性。通过自动轮询检测方法&#xff0c;结合硬件检测模型和多通道检测系统设计&#xff0c;本…...

Jenkins解决Host key verification failed (2)

Jenkins解决Host key verification failed 分析原因情况 一、用OpenSSH的人都知ssh会把你每个你访问过计算机的公钥(public key)都记录在~/.ssh/known_hosts。当下次访问相同计算机时&#xff0c;OpenSSH会核对公钥。如果公钥不同&#xff0c;OpenSSH会发出警告&#xff0c;避免…...

C#,数值计算,矩阵的乔莱斯基分解(Cholesky decomposition)算法与源代码

一、安德烈路易斯乔尔斯基 安德烈路易斯乔尔斯基出生于法国波尔多以北的查伦特斯海域的蒙古扬。他在波尔多参加了Lyce e&#xff0c;并于1892年11月14日获得学士学位的第一部分&#xff0c;于1893年7月24日获得第二部分。1895年10月15日&#xff0c;乔尔斯基进入莱科尔理工学院…...

docker 备份 mysql

使用 Docker 执行 MySQL 备份是一个实用的操作&#xff0c;可以帮助你确保数据的安全性和可恢复性。这里有一步步的指导帮你完成&#xff1a; 1. 确定 MySQL 容器名称或 ID 首先&#xff0c;你需要知道运行 MySQL 数据库的容器的名称或 ID。可以通过下面的命令查看所有正在运…...

使用C# Net6连接国产达梦数据库记录

达梦官网&#xff1a;http://www.dameng.com/ 1 下载达梦并进行安装 下载地址&#xff1a;官网首页——服务与合作——下载中心&#xff08;https://www.dameng.com/list_103.html&#xff09; 根据需要自行下载需要的版本&#xff0c;测试版本为&#xff1a;x86 win64 DM8版…...

docker (八)-dockerfile制作镜像

一 dockerfile dockerfile通常包含以下几个常用命令&#xff1a; FROM ubuntu:18.04 WORKDIR /app COPY . . RUN make . CMD python app.py EXPOSE 80 FROM 打包使用的基础镜像WORKDIR 相当于cd命令&#xff0c;进入工作目录COPY 将宿主机的文件复制到容器内RUN 打包时执…...

Java 8 Stream API 入门到实践详解

一、告别 for 循环&#xff01; 传统痛点&#xff1a; Java 8 之前&#xff0c;集合操作离不开冗长的 for 循环和匿名类。例如&#xff0c;过滤列表中的偶数&#xff1a; List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)

UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中&#xff0c;UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化&#xf…...

3-11单元格区域边界定位(End属性)学习笔记

返回一个Range 对象&#xff0c;只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意&#xff1a;它移动的位置必须是相连的有内容的单元格…...

管理学院权限管理系统开发总结

文章目录 &#x1f393; 管理学院权限管理系统开发总结 - 现代化Web应用实践之路&#x1f4dd; 项目概述&#x1f3d7;️ 技术架构设计后端技术栈前端技术栈 &#x1f4a1; 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 &#x1f5c4;️ 数据库设…...

C++.OpenGL (14/64)多光源(Multiple Lights)

多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...

人机融合智能 | “人智交互”跨学科新领域

本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...

MySQL 知识小结(一)

一、my.cnf配置详解 我们知道安装MySQL有两种方式来安装咱们的MySQL数据库&#xff0c;分别是二进制安装编译数据库或者使用三方yum来进行安装,第三方yum的安装相对于二进制压缩包的安装更快捷&#xff0c;但是文件存放起来数据比较冗余&#xff0c;用二进制能够更好管理咱们M…...

C++ 设计模式 《小明的奶茶加料风波》

&#x1f468;‍&#x1f393; 模式名称&#xff1a;装饰器模式&#xff08;Decorator Pattern&#xff09; &#x1f466; 小明最近上线了校园奶茶配送功能&#xff0c;业务火爆&#xff0c;大家都在加料&#xff1a; 有的同学要加波霸 &#x1f7e4;&#xff0c;有的要加椰果…...

Proxmox Mail Gateway安装指南:从零开始配置高效邮件过滤系统

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

解析奥地利 XARION激光超声检测系统:无膜光学麦克风 + 无耦合剂的技术协同优势及多元应用

在工业制造领域&#xff0c;无损检测&#xff08;NDT)的精度与效率直接影响产品质量与生产安全。奥地利 XARION开发的激光超声精密检测系统&#xff0c;以非接触式光学麦克风技术为核心&#xff0c;打破传统检测瓶颈&#xff0c;为半导体、航空航天、汽车制造等行业提供了高灵敏…...