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

news/2024/7/9 2:05:34

【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值
  • 五、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允许直接使用结果投影,使你能够将查询映射到给定的域类型,同时将操作结果投影到另一个域类型,如下所述。

class

template.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");              --------1

query.fields().exclude("id").include("lastname") --------2

query.fields().include("address")                --------3

query.fields().include("address.city")           --------4

1. 通过{“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");                                                     --------2

query.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-based Query Methods and Field Restriction中所述。

三、 其他查询选项

3.1 Hints

3.2 游标批大小Cursor Batch Size

3.3 Collations

3.4 读取首选项Read Preference

3.5 Comments

四、查询Distinct值

五、Geo-near 查询

六、GeoJSON 支持

七、域类中的GeoJSON类型

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

九、度量和距离计算

十、全文检索

十一、Query by Example

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


http://lihuaxi.xjx100.cn/news/2050997.html

相关文章

云计算拼的是运维吗

云计算拼的是运维吗&#xff1f;云计算并不仅仅是拼运维&#xff0c;还有其他方面也很重要。 在云计算中&#xff0c;运维确实是一个重要的方面。运维涉及管理和维护云基础设施、服务器、网络和存储等组件&#xff0c;以确保它们的正常运行、高可用性和安全性。运维人员负责监…

2024.2.25 模拟实现 RabbitMQ —— 网络通信设计(服务器)

目录 引言 约定应用层的通信协议 自定义应用层协议 Type Length PayLod 实现 Broker Server 类 属性 与 构造 启动 Broker Server 停止 Broker Server 处理客户端连接 读取请求 与 写回响应 根据请求计算响应 清除 channel 引言 生产者 和 消费者 都是客户端&…

【C++11并发】chrono 笔记

简介 C11的chrono模块为我们主要提供了三个类&#xff1a; 表示时间点的time_point表示时间段的duration提供计时起点的clock 一般我们会通过clock获取时间点&#xff0c;两个时间点之差可以获取时间段。 头文件&#xff1a;<chrono> std::chrono::duration durati…

[算法沉淀记录]排序算法 —— 快速排序

排序算法 —— 快速排序介绍 基本概念 快速排序&#xff08;Quicksort&#xff09;是一种排序算法&#xff0c;最早由东尼霍尔提出。在平均状况下&#xff0c;排序 n 个项目要 Ο(n log n) 次比较。在最坏状况下则需要 Ο(n2) 次比较&#xff0c;但这种状况并不常见。事实上&…

Flutter Version Manager (FVM): Flutter的版本管理终极指南

Flutter笔记 Flutter Version Manager (FVM) - 文章信息 - Author: 李俊才 (jcLee95) Visit me at: https://jclee95.blog.csdn.netEmail: 291148484163.com. Shenzhen ChinaAddress of this article:https://blog.csdn.net/qq_28550263/article/details/136300307 my-websit…

【iOS ARKit】存储与共享

持久化存储与共享体验技术基础 AR数据持久化存储与体验共享是一个庞大的主题&#xff0c;ARKit 提供了目前业内最好的解决方案。为解决数据持久化存储的问题&#xff0c;ARKit 提供了 ARWorldMap 技术&#xff1b;为解决体验共享的问题&#xff0c;ARKit 提供了协作Session &am…

分布式概念详解 - 构建高效、可扩展的分布式系统之基石

分布式概念详解 - 构建高效、可扩展的分布式系统之基石 摘要&#xff1a;本文将深入探讨分布式系统的基本概念&#xff0c;分析其在现代计算机技术中的重要性&#xff0c;并通过实际案例与原理阐述分布式系统的核心组成要素。我们将一起了解如何通过这些分布式概念构建高效、可…

应急响应-常规处置办法

网站中被植入Webshell&#xff0c;通常代表着网站中存在可利用的高危漏洞&#xff0c;攻击者利用这些漏洞&#xff0c;将Webshell写入网站&#xff0c;从而获取网站的控制权。一旦在网站中发现webshell文件&#xff0c;可采取以下步骤进行临时处置。 入侵确定时间 通过在网站…