【Spring连载】使用Spring Data访问 MongoDB----Template API 查询Documents

本文主要是介绍【Spring连载】使用Spring Data访问 MongoDB----Template API 查询Documents,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

【Spring连载】使用Spring Data访问 MongoDB----Template API 查询Documents

  • 一、 查询集合中的Documents
  • 二 选择字段
  • 三、 其他查询选项
    • 3.1 Hints
    • 3.2 游标批大小Cursor Batch Size
    • 3.3 Collations
    • 3.4 读取首选项Read Preference
    • 3.5 Comments
  • 四、查询Distinct值
  • 五、GeoSpatial Queries
  • 六、Geo-near 查询
  • 七、GeoJSON 支持
  • 八、域类中的GeoJSON类型
  • 九、存储库查询方法中的GeoJSON 类型
  • 十、度量和距离计算
  • 十一、全文检索
  • 十二、Query by Example
  • 十三、查询一个集合以匹配JSON Schema

你可以使用Query和Criteria类来表达查询。它们的方法名称反映了native MongoDB操作名称,如lt、lte、is和其他名称。Query和Criteria类遵循fluent API风格,因此你可以将多个方法标准和查询链接在一起,同时拥有易于理解的代码。为了提高可读性,静态导入可以避免在创建查询和条件实例时使用“new”关键字。你还可以使用BasicQuery从纯JSON字符串创建Query实例,如下例所示:
例1:从纯JSON字符串创建查询实例

BasicQuery query = new BasicQuery("{ age : { $lt : 50 }, accounts.balance : { $gt : 1000.00 }}");
List<Person> result = mongoTemplate.find(query, Person.class);

一、 查询集合中的Documents

在之前的章节,我们看到了如何在MongoTemplate上使用findOne和findById方法来检索单个文档。这些方法以正确的方式返回单个域对象,或者使用响应式(reactive )API Mono发出单个元素。我们还可以查询要作为域对象列表返回的documents集合。假设我们在一个集合中有许多具有姓名和年龄的Person对象作为documents存储,并且每个人都有一个带有余额的内嵌的帐户document,我们现在可以使用以下代码运行查询:
使用MongoTemplate查询文档

// ...List<Person> result = template.query(Person.class).matching(query(where("age").lt(50).and("accounts.balance").gt(1000.00d))).all();

所有find方法都将Query对象作为参数。此对象定义用于执行查询的条件和选项。通过使用Criteria对象来指定条件,该对象具有一个名为where的静态工厂方法来实例化新的Criteria。我们建议对org.springframework.data.mongodb.core.query.Criteria.where和Query.query使用静态导入,使查询更具可读性。
查询应该返回符合指定条件的Person对象的List或Flux。本节的剩余部分列出了与MongoDB中提供的运算符相对应的Criteria和Query类的方法。大多数方法返回Criteria对象,为API提供流畅的样式。
Criteria的方法
Criteria类提供了以下方法,所有这些方法都对应于MongoDB中的运算符:

  • Criteria all (Object o)使用$all运算符创建一个条件
  • Criteria and (String key)将具有指定key的链式Criteria添加到当前Criteria并返回新创建的Criteria
  • Criteria andOperator (Criteria…​ criteria)使用$and运算符为所有提供的条件创建and查询
  • Criteria andOperator (Collection< Criteria> criteria)使用$and运算符为所有提供的条件创建and查询
  • Criteria elemMatch (Criteria c)使用$elemMatch运算符创建条件
  • Criteria exists (boolean b)使用$exists运算符创建条件
  • Criteria gt (Object o)使用$gt运算符创建条件
  • Criteria gte (Object o)使用$gte运算符创建条件
  • Criteria in (Object…​ o) 使用$in运算符为varargs参数创建一个条件。
  • Criteria in (Collection<?> collection)使用$in运算符并使用集合创建条件
  • Criteria is (Object o)使用字段匹配({key:value})创建条件。如果指定的值是一个document,则字段的顺序和document中的完全相等性很重要。
  • Criteria lt (Object o)使用$lt运算符创建条件
  • Criteria lte (Object o)使用$lte运算符创建一个条件
  • Criteria mod (Number value, Number remainder)使用$mod运算符创建一个条件
  • Criteria ne (Object o)使用$ne运算符创建条件
  • Criteria nin (Object…​ o)使用$nin运算符创建条件
  • Criteria norOperator (Criteria…​ criteria)为所有提供的条件使用$nor运算符创建nor查询
  • Criteria norOperator(Collection<Criteria>Criteria)为所有提供的条件使用$nor运算符创建nor查询
  • Criteria not ()使用$not元运算符创建一个条件,该运算符直接影响后面的子句
  • Criteria orOperator (Criteria…​ criteria)为所有提供的条件使用$or运算符创建or查询
  • Criteria orOperator (Collection< Criteria> criteria)使用$或运算符为所有提供的条件创建或查询
  • Criteria regex (String re)使用$regex创建条件
  • Criteria sampleRate (double sampleRate)使用$sampleRate运算符创建条件
  • Criteria size (int s)使用$size运算符创建条件
  • Criteria type (int t)使用$type运算符创建条件
  • Criteria matchingDocumentStructure (MongoJsonSchema schema)使用 $ jsonSchema 运算符为JSON schema criteria创建一个条件。$jsonSchema只能应用于查询的顶层,而不能应用于特定属性。使用schema的properties属性来匹配嵌套字段。
  • Criteria bits() 是调用MongoDB bitwise query operators(如$bitsAllClear)的网关。

Criteria类还提供了以下用于地理空间查询的方法。

  • Criteria within (Circle circle)使用$geoWithin $center操作符创建地理空间条件。
  • Criteria within (Box box)使用$geoWithin $box操作创建地理空间条件。
  • Criteria withinSphere (Circle circle)使用$geoWithin $center操作符创建地理空间条件。
  • Criteria near (Point point)使用$near操作创建地理空间条件
  • Criteria nearSphere (Point point)使用$nearSphere $center操作创建地理空间条件。
  • Criteria minDistance (double minDistance)使用 $ minDistance 操作创建地理空间条件,与$near一同使用。
  • Criteria maxDistance (double maxDistance)使用 $ maxDistance 操作创建地理空间条件,与$near一同使用。

Query类有一些附加的方法,这些方法允许选择某些字段以及对结果进行limit和排序。
Query类的方法

  • Query addCriteria (Criteria criteria),用于向查询添加其他条件
  • Field fields (),用于定义要包含在查询结果中的字段
  • Query limit (int limit)用于将返回结果的大小限制为提供的limit (用于分页)
  • Query skip(int skip)用于跳过结果中提供的documents数(用于分页)
  • Query with (Sort sort)用于为结果提供排序定义
  • Query with (ScrollPosition position)用于提供滚动(Scroll)位置(基于Offset或Keyset的分页)以开始或恢复滚动

template API允许直接使用结果投影,使你能够将查询映射到给定的域类型,同时将操作结果投影到另一个域类型,如下所述。

classtemplate.query(SWCharacter.class).as(Jedi.class)

有关结果投影的更多信息,请参阅Spring Data Projections的文档。

二 选择字段

MongoDB支持投影查询返回的字段。投影可以根据字段的名称包括和排除字段(除非明确排除,否则始终包括_id字段)。
例2:选择结果字段

public class Person {@Id String id;String firstname;@Field("last_name")String lastname;Address address;
}
query.fields().include("lastname");              --------1query.fields().exclude("id").include("lastname") --------2query.fields().include("address")                --------3query.fields().include("address.city")           --------41. 通过{“last_name”:1,结果将同时包含_id和last_name。
2. 通过{“_id”:0,“last_name”:1,结果将仅包含last_name 。
3. 通过{“address”:1}结果将包含_id和整个地址对象。
4. 通过{“address.city”:1,结果将包含_id和address对象,该address仅包含city字段。

从MongoDB 4.4开始,你可以使用聚合表达式进行字段投影,如下所示:
例3:使用表达式计算结果字段

query.fields().project(MongoExpression.create("'$toUpper' : '$last_name'"))         --------1.as("last_name");                                                     --------2query.fields().project(StringOperators.valueOf("lastname").toUpper())               --------3.as("last_name");query.fields().project(AggregationSpELExpression.expressionOf("toUpper(lastname)")) --------4.as("last_name");1. 使用native表达式。使用的字段名称必须引用数据库document中的字段名称。
2. 指定表达式结果投影到的字段名称。生成的字段名称未映射到域模型。
3. 使用聚合表达式。除了native MongoExpression之外,字段名被映射到域模型中使用的字段名。
4.SpELAggregationExpression一起使用可以调用表达式函数。字段名称将映射到域模型中使用的字段名称。

@Query(fields=“…”)允许在存储库级别使用表达式字段投影,如MongoDB 基于JSON的查询方法和字段限制中所述。

三、 其他查询选项

MongoDB提供了各种将元信息(如注释[comment]或批处理大小)应用于查询的方法。直接使用Query API,这些选项有几种方法。

3.1 Hints

可以通过两种方式应用索引提示(hint),使用索引名称或其字段定义。

template.query(Person.class).matching(query("...").withHint("index-to-use"));template.query(Person.class).matching(query("...").withHint("{ firstname : 1 }"));

3.2 游标批大小Cursor Batch Size

游标批大小定义了每个响应批中要返回的文档数量。

Query query = query(where("firstname").is("luke")).cursorBatchSize(100)

3.3 Collations

在集合操作中使用collations是在查询或操作选项中指定Collation实例的问题,如下两个示例所示:

Collation collation = Collation.of("de");Query query = new Query(Criteria.where("firstName").is("Amél")).collation(collation);List<Person> results = template.find(query, Person.class);

3.4 读取首选项Read Preference

可以在要运行的Query对象上直接设置要使用的ReadPreference,如下所示。

template.find(Person.class).matching(query(where(...)).withReadPreference(ReadPreference.secondary())).all();

Query实例上的首选项设置将取代MongoTemplate的默认ReadPreference。

3.5 Comments

查询可以配备注释,这使得它们更容易在服务器日志中查找。

template.find(Person.class).matching(query(where(...)).comment("Use the force luke!")).all();

四、查询Distinct值

MongoDB提供了一个操作,通过对结果documents的查询来获得单个字段的distinct值。结果值不需要具有相同的数据类型,该功能也不限于简单类型。对于检索,为了转换和typing,实际的结果类型确实很重要。以下示例展示了如何查询distinct值:
例4:检索distinct值

template.query(Person.class)  --------1.distinct("lastname")       --------2.all();                     --------31. 查询Person集合。
2. 选择lastname字段的distinct值。字段名称是根据域类型属性声明映射的,并考虑到潜在的@Field注解。
3. 将所有distinct值检索为对象列表(由于未指定明确的结果类型)。

将distinct值检索到对象集合中是最灵活的方法,因为它试图确定域类型的属性值,并将结果转换为所需的类型或映射Document结构。
有时,当所需字段的所有值都固定为某个类型时,直接获得正确类型的集合会更方便,如下例所示:
例5:检索强类型的distinct值

template.query(Person.class)  --------1.distinct("lastname")       --------2.as(String.class)           --------3.all();                     --------41. 查询Person的集合。
2. 选择lastname字段的distinct值。字段名是根据域类型属性声明映射的,同时考虑了潜在的@Field注释。
3. 将检索到的值转换为所需的目标类型——在本例中为String。如果存储的字段包含document,也可以将值映射到更复杂的类型。
4.String列表的形式检索所有distinct值。如果无法将类型转换为所需的目标类型,则此方法将抛出DataAccessException

五、GeoSpatial Queries

MongoDB通过使用$ near、$ within、geoWithin和$nearSphere等运算符来支持GeoSpatial查询。“Criteria”类中提供了特定于地理空间查询的方法。还有一些形状类(Box, Circle 和Point)与地理空间相关的“Criteria”方法一起使用。
在MongoDB事务中使用GeoSpatial查询时需要注意,请参阅事务内部的特殊行为。
要了解如何执行GeoSpatial查询,请考虑以下Venue类(取自集成测试并依赖于MappingMongoConverter):
Venue.java

@Document(collection="newyork")
public class Venue {@Idprivate String id;private String name;private double[] location;@PersistenceConstructorVenue(String name, double[] location) {super();this.name = name;this.location = location;}public Venue(String name, double x, double y) {super();this.name = name;this.location = new double[] { x, y };}public String getName() {return name;}public double[] getLocation() {return location;}@Overridepublic String toString() {return "Venue [id=" + id + ", name=" + name + ", location="+ Arrays.toString(location) + "]";}
}

要查找Circle内的位置,你可以使用以下查询:

Circle circle = new Circle(-73.99171, 40.738868, 0.01);
List<Venue> venues =template.find(new Query(Criteria.where("location").within(circle)), Venue.class);

要使用球坐标查找圆内的venues,可以使用以下查询:

Circle circle = new Circle(-73.99171, 40.738868, 0.003712240453784);
List<Venue> venues =template.find(new Query(Criteria.where("location").withinSphere(circle)), Venue.class);

要查找Box内的venues,你可以使用以下查询:

//lower-left then upper-right
Box box = new Box(new Point(-73.99756, 40.73083), new Point(-73.988135, 40.741404));
List<Venue> venues =template.find(new Query(Criteria.where("location").within(box)), Venue.class);

你可使用下列查询查询,以查询邻近某个点的venues:

Point point = new Point(-73.99171, 40.738868);
List<Venue> venues =template.find(new Query(Criteria.where("location").near(point).maxDistance(0.01)), Venue.class);

六、Geo-near 查询

七、GeoJSON 支持

八、域类中的GeoJSON类型

九、存储库查询方法中的GeoJSON 类型

十、度量和距离计算

十一、全文检索

十二、Query by Example

十三、查询一个集合以匹配JSON Schema

这篇关于【Spring连载】使用Spring Data访问 MongoDB----Template API 查询Documents的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/752284

相关文章

MyBatis分页查询实战案例完整流程

《MyBatis分页查询实战案例完整流程》MyBatis是一个强大的Java持久层框架,支持自定义SQL和高级映射,本案例以员工工资信息管理为例,详细讲解如何在IDEA中使用MyBatis结合Page... 目录1. MyBATis框架简介2. 分页查询原理与应用场景2.1 分页查询的基本原理2.1.1 分

Spring Security简介、使用与最佳实践

《SpringSecurity简介、使用与最佳实践》SpringSecurity是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架,本文给大家介绍SpringSec... 目录一、如何理解 Spring Security?—— 核心思想二、如何在 Java 项目中使用?——

SpringBoot+RustFS 实现文件切片极速上传的实例代码

《SpringBoot+RustFS实现文件切片极速上传的实例代码》本文介绍利用SpringBoot和RustFS构建高性能文件切片上传系统,实现大文件秒传、断点续传和分片上传等功能,具有一定的参考... 目录一、为什么选择 RustFS + SpringBoot?二、环境准备与部署2.1 安装 RustF

springboot中使用okhttp3的小结

《springboot中使用okhttp3的小结》OkHttp3是一个JavaHTTP客户端,可以处理各种请求类型,比如GET、POST、PUT等,并且支持高效的HTTP连接池、请求和响应缓存、以及异... 在 Spring Boot 项目中使用 OkHttp3 进行 HTTP 请求是一个高效且流行的方式。

java.sql.SQLTransientConnectionException连接超时异常原因及解决方案

《java.sql.SQLTransientConnectionException连接超时异常原因及解决方案》:本文主要介绍java.sql.SQLTransientConnectionExcep... 目录一、引言二、异常信息分析三、可能的原因3.1 连接池配置不合理3.2 数据库负载过高3.3 连接泄漏

javacv依赖太大导致jar包也大的解决办法

《javacv依赖太大导致jar包也大的解决办法》随着项目的复杂度和依赖关系的增加,打包后的JAR包可能会变得很大,:本文主要介绍javacv依赖太大导致jar包也大的解决办法,文中通过代码介绍的... 目录前言1.检查依赖2.更改依赖3.检查副依赖总结 前言最近在写项目时,用到了Javacv里的获取视频

Java实现字节字符转bcd编码

《Java实现字节字符转bcd编码》BCD是一种将十进制数字编码为二进制的表示方式,常用于数字显示和存储,本文将介绍如何在Java中实现字节字符转BCD码的过程,需要的小伙伴可以了解下... 目录前言BCD码是什么Java实现字节转bcd编码方法补充总结前言BCD码(Binary-Coded Decima

SpringBoot全局域名替换的实现

《SpringBoot全局域名替换的实现》本文主要介绍了SpringBoot全局域名替换的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录 项目结构⚙️ 配置文件application.yml️ 配置类AppProperties.Ja

Java使用Javassist动态生成HelloWorld类

《Java使用Javassist动态生成HelloWorld类》Javassist是一个非常强大的字节码操作和定义库,它允许开发者在运行时创建新的类或者修改现有的类,本文将简单介绍如何使用Javass... 目录1. Javassist简介2. 环境准备3. 动态生成HelloWorld类3.1 创建CtC

JavaScript中的高级调试方法全攻略指南

《JavaScript中的高级调试方法全攻略指南》什么是高级JavaScript调试技巧,它比console.log有何优势,如何使用断点调试定位问题,通过本文,我们将深入解答这些问题,带您从理论到实... 目录观点与案例结合观点1观点2观点3观点4观点5高级调试技巧详解实战案例断点调试:定位变量错误性能分