当前位置: 首页 > 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 打包时执…...

网络六边形受到攻击

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 抽象 现代智能交通系统 &#xff08;ITS&#xff09; 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 &#xff08;…...

日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻

在如今就业市场竞争日益激烈的背景下&#xff0c;越来越多的求职者将目光投向了日本及中日双语岗位。但是&#xff0c;一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧&#xff1f;面对生疏的日语交流环境&#xff0c;即便提前恶补了…...

云计算——弹性云计算器(ECS)

弹性云服务器&#xff1a;ECS 概述 云计算重构了ICT系统&#xff0c;云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台&#xff0c;包含如下主要概念。 ECS&#xff08;Elastic Cloud Server&#xff09;&#xff1a;即弹性云服务器&#xff0c;是云计算…...

VB.net复制Ntag213卡写入UID

本示例使用的发卡器&#xff1a;https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...

shell脚本--常见案例

1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件&#xff1a; 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...

Cesium1.95中高性能加载1500个点

一、基本方式&#xff1a; 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...

基于Flask实现的医疗保险欺诈识别监测模型

基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施&#xff0c;由雇主和个人按一定比例缴纳保险费&#xff0c;建立社会医疗保险基金&#xff0c;支付雇员医疗费用的一种医疗保险制度&#xff0c; 它是促进社会文明和进步的…...

大语言模型如何处理长文本?常用文本分割技术详解

为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...

【单片机期末】单片机系统设计

主要内容&#xff1a;系统状态机&#xff0c;系统时基&#xff0c;系统需求分析&#xff0c;系统构建&#xff0c;系统状态流图 一、题目要求 二、绘制系统状态流图 题目&#xff1a;根据上述描述绘制系统状态流图&#xff0c;注明状态转移条件及方向。 三、利用定时器产生时…...

深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南

&#x1f680; C extern 关键字深度解析&#xff1a;跨文件编程的终极指南 &#x1f4c5; 更新时间&#xff1a;2025年6月5日 &#x1f3f7;️ 标签&#xff1a;C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言&#x1f525;一、extern 是什么&#xff1f;&…...