Spring Data (数据)MongoDB

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring Data (数据)MongoDB相关的知识,希望对你有一定的参考价值。

Spring

10.6. 查询文档

您可以使用 theandclasses 来表达您的查询。它们具有反映本机MongoDB运算符名称的方法名称,例如,,,等。Theandclasses 遵循流畅的 API 样式,因此您可以将多个方法条件和查询链接在一起,同时具有易于理解的代码。为了提高可读性,静态导入允许您避免使用“new”关键字来创建和实例。您还可以使用从纯 JSON 字符串创建实例,如以下示例所示:​​Query​​​​Criteria​​​​lt​​​​lte​​​​is​​​​Query​​​​Criteria​​​​Query​​​​Criteria​​​​BasicQuery​​​​Query​

例 66。从纯 JSON 字符串创建查询实例

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

Spring MongoDB还支持GeoSpatial Query(参见GeoSpatial Query部分)和Map-Reduce操作(参见Map-Reduce部分)。

10.6.1. 查询集合中的文档

前面,我们看到了如何使用 theand 方法来检索单个文档。这些方法返回单个域对象。我们还可以查询要作为域对象列表返回的文档集合。假设我们有许多对象的名称和期限作为文档存储在集合中,并且每个人都有一个带有余额的嵌入式帐户文档,我们现在可以使用以下代码运行查询:​​findOne​​​​findById​​​​MongoTemplate​​​​Person​

例 67。使用 MongoTemplate 查询文档

// ...

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

所有查找方法都将对象作为参数。此对象定义用于执行查询的条件和选项。条件是通过使用具有名为实例化新对象的静态工厂方法的对象来指定的。我们建议使用 static 导入 forand,以使查询更具可读性。​​Query​​​​Criteria​​​​where​​​​Criteria​​​​org.springframework.data.mongodb.core.query.Criteria.where​​​​Query.query​

查询应返回满足指定条件的对象列表。本节的其余部分列出了与MongoDB中提供的运算符相对应的theand类的方法。大多数方法返回对象,以便为 API 提供流畅的样式。​​Person​​​​Criteria​​​​Query​​​​Criteria​

条件类的方法

Theclass 提供了以下方法,所有这些方法都对应于 MongoDB 中的运算符:​​Criteria​

  • ​Criteria​​ 使用运算符创建条件(Object o)$all
  • ​Criteria​​ 将一个链接与指定的 添加到当前并返回新创建的(String key)CriteriakeyCriteria
  • ​Criteria​​ 和操作员使用运算符为所有提供的条件创建 and 查询(需要 MongoDB 2.0 或更高版本)(Criteria…​ criteria)$and
  • ​Criteria​​ 和操作员使用运算符为所有提供的条件创建 and 查询(需要 MongoDB 2.0 或更高版本)(Collection<Criteria> criteria)$and
  • ​Criteria​​ elemMatch使用运算符创建条件(Criteria c)$elemMatch
  • ​Criteria​​ 存在使用运算符创建条件(boolean b)$exists
  • ​Criteria​​ 燃气轮机使用运算符创建条件(Object o)$gt
  • ​Criteria​​ GTE使用运算符创建条件(Object o)$gte
  • ​Criteria​​ 使用 varargs 参数的运算符创建条件。(Object…​ o)$in
  • ​Criteria​​ 使用集合使用运算符创建条件(Collection<?> collection)$in
  • ​Criteria​​ 使用字段匹配 () 创建条件。如果指定的值是文档,则字段中字段的顺序和文档中的完全相等性很重要。(Object o) key:value
  • ​Criteria​​ 使用运算符创建条件(Object o)$lt
  • ​Criteria​​ 电信使用运算符创建条件(Object o)$lte
  • ​Criteria​​ 国防部使用运算符创建条件(Number value, Number remainder)$mod
  • ​Criteria​​ 使用运算符创建条件(Object o)$ne
  • ​Criteria​​ 使用运算符创建条件(Object…​ o)$nin
  • ​Criteria​​ norOperator使用运算符为所有提供的条件创建 nor 查询(Criteria…​ criteria)$nor
  • ​Criteria​​ norOperator使用运算符为所有提供的条件创建 nor 查询(Collection<Criteria> criteria)$nor
  • ​Criteria​​ 使用 themeta 运算符创建一个条件,该运算符直接影响紧随其后的子句()$not
  • ​Criteria​​ 或运算符使用运算符为所有提供的条件创建 or 查询(Criteria…​ criteria)$or
  • ​Criteria​​ 或运算符使用运算符为所有提供的条件创建 or 查询(Collection<Criteria> criteria)$or
  • ​Criteria​​ 正则表达式使用(String re)$regex
  • ​Criteria​​ 采样率使用运算符创建条件(double sampleRate)$sampleRate
  • ​Criteria​​ 大小使用运算符创建条件(int s)$size
  • ​Criteria​​ 类型使用运算符创建条件(int t)$type
  • ​Criteria​​ 匹配文档结构使用JSON 架构条件的运算符创建条件。只能应用于查询的顶层,而不能应用于特定于属性。使用架构的属性与嵌套字段匹配。(MongoJsonSchema schema)$jsonSchema$jsonSchemaproperties
  • ​Criteria​​ bits()是MongoDB按位查询运算符的网关。$bitsAllClear

Criteria 类还为地理空间查询提供了以下方法(请参阅地理空间查询部分以查看它们的实际操作):

  • ​Criteria​​ 使用运算符创建地理空间条件。(Circle circle)$geoWithin $center
  • ​Criteria​​ 使用操作创建地理空间条件。(Box box)$geoWithin $box
  • ​Criteria​​ 在球体内使用运算符创建地理空间条件。(Circle circle)$geoWithin $center
  • ​Criteria​​ 使用操作创建地理空间条件(Point point)$near
  • ​Criteria​​ 近球体使用操作创建地理空间条件。这仅适用于MongoDB 1.7及更高版本。(Point point)$nearSphere$center
  • ​Criteria​​ 最小距离使用操作创建地理空间条件,以便与$near一起使用。(double minDistance)$minDistance
  • ​Criteria​​ 最大距离使用操作创建地理空间条件,以便与$near一起使用。(double maxDistance)$maxDistance
查询类的方法

该类有一些其他方法,为查询提供选项:​​Query​

  • ​Query​​ add用于向查询添加其他条件的条件(Criteria criteria)
  • ​Field​​ 用于定义要包含在查询结果中的字段的字段()
  • ​Query​​ 限制用于将返回结果的大小限制为提供的限制(用于分页)(int limit)
  • ​Query​​ skip用于跳过结果中提供的文档数(用于分页)(int skip)
  • ​Query​​ 用于为结果提供排序定义(Sort sort)
选择字段

MongoDB支持投影查询返回的字段。 投影可以根据字段的名称包含和排除字段(除非显式排除,否则始终包含字段)。​​_id​

例 68。选择结果字段

public class Person 

@Id String id;
String firstname;

@Field("last_name")
String lastname;

Address address;


query.fields().include("lastname");

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

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

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

结果将包含两者和过孔。​​_id​​​​last_name​​​​ "last_name" : 1 ​

结果将仅包含过孔。​​last_name​​​​ "_id" : 0, "last_name" : 1 ​

结果将包含和整个对象通过。​​_id​​​​address​​​​ "address" : 1 ​

结果将包含仅包含字段 via 的 and 和对象。​​_id​​​​address​​​​city​​​​ "address.city" : 1 ​

从MongoDB 4.4开始,您可以使用聚合表达式进行字段投影,如下所示:

例 69。使用表达式计算结果字段

query.fields()
.project(MongoExpression.create("$toUpper : $last_name"))
.as("last_name");

query.fields()
.project(StringOperators.valueOf("lastname").toUpper())
.as("last_name");

query.fields()
.project(AggregationSpELExpression.expressionOf("toUpper(lastname)"))
.as("last_name");

使用本机表达式。使用的字段名称必须引用数据库文档中的字段名称。

指定表达式结果投影到的字段名称。生成的字段名称不会针对域模型进行映射。

使用一个。除本机名称外,字段名称将映射到域模型中使用的字段名称。​​AggregationExpression​​​​MongoExpression​

使用 SpEL 和 anto 调用表达式函数。字段名称将映射到域模型中使用的字段名称。​​AggregationExpression​

​@Query(fields="…")​​允许在基于MongoDB JSON 的查询方法和字段限制中所述的级别使用表达式字段投影。​​Repository​

10.6.2. 查询文档的方法

查询方法需要指定返回的目标类型,并且对于应对返回类型指示的集合以外的集合进行操作的查询,它们使用显式集合名称进行重载。以下查询方法允许您查找一个或多个文档:​​T​

  • findAll:查询集合中的类型对象列表。T
  • findOne:将集合上的即席查询结果映射到指定类型的对象的单个实例。
  • findById:返回给定 ID 和目标类的对象。
  • find:将集合上的即席查询结果映射到指定类型的 a。List
  • findAndRemove:将集合上的即席查询结果映射到指定类型的对象的单个实例。将返回与查询匹配的第一个文档,并从数据库中的集合中删除。

10.6.3. 查询非重复值

MongoDB提供了一个操作,通过使用来自结果文档中的查询来获取单个字段的不同值。 结果值不需要具有相同的数据类型,该功能也不限于简单类型。 对于检索,实际结果类型对于转换和键入确实很重要。以下示例演示如何查询非重复值:

例 70。检索非重复值

template.query(Person.class)  
.distinct("lastname")
.all();

查询集合。​​Person​

选择字段的不同值。字段名称根据域类型属性声明进行映射,同时考虑潜在的注释。​​lastname​​​​@Field​

检索所有非重复值作为 aof(由于未指定显式结果类型)。​​List​​​​Object​

将非重复值检索到 aofis 是最灵活的方法,因为它尝试确定域类型的属性值并将结果转换为所需的类型或映射结构。​​Collection​​​​Object​​​​Document​

有时,当所需字段的所有值都固定为某个类型时,直接获取正确键入的值会更方便,如以下示例所示:​​Collection​

例 71。检索强类型非重复值

template.query(Person.class)  
.distinct("lastname")
.as(String.class)
.all();

查询集合。​​Person​

选择字段的不同值。字段名称根据域类型属性声明进行映射,同时考虑潜在的注释。​​lastname​​​​@Field​

检索到的值将转换为所需的目标类型 — 在本例中为。如果存储的字段包含文档,也可以将值映射到更复杂的类型。​​String​

检索所有非重复值作为 aof。如果无法将类型转换为所需的目标类型,则此方法将引发 a。​​List​​​​String​​​​DataAccessException​

10.6.4. 地理空间查询

MongoDB通过使用诸如,,,和)等运算符来支持GeoSpatial 查询。特定于地理空间查询的方法可在类上找到。还有一些形状类(、和)与地理空间相关方法结合使用。​​$near​​​​$within​​​​geoWithin​​​​$nearSphere​​​​Criteria​​​​Box​​​​Circle​​​​Point​​​​Criteria​

在 MongoDB 事务中使用时,使用地理空间查询需要注意,请参阅事务内的特殊行为。

若要了解如何执行 GeoSpatial 查询,请考虑以下类(取自集成测试并依赖于丰富的类):​​Venue​​​​MappingMongoConverter​

@Document(collection="newyork")
public class Venue

@Id
private String id;
private String name;
private double[] location;

@PersistenceConstructor
Venue(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;


@Override
public 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);

要在球面坐标内查找场地,可以使用以下查询:​​Circle​

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​

//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);

要查找 a 附近的场地,您可以使用以下查询:​​Point​

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

要查找球面坐标附近的场地,可以使用以下查询:​​Point​

Point point = new Point(-73.99171, 40.738868);
List<Venue> venues =
template.find(new Query(
Criteria.where("location").nearSphere(point).maxDistance(0.003712240453784)),
Venue.class);
地理邻近查询


在 2.2 中更改!
​MongoDB 4.2​删除了对以前用于运行的命令的支持。​​geoNear​​​​NearQuery​



Spring Data MongoDB 2.2使用聚合​而不是命令来运行一个。​​MongoOperations#geoNear​​​​$geoNear​​​​geoNear​​​​NearQuery​



以前在包装器类型中返回的计算距离(使用 geoNear 命令时)现在嵌入在包装器类型中 到生成的文档中。 如果给定的域类型已包含具有该名称的属性,则计算的距离 使用可能随机的后缀命名。​​dis​​​​calculated-distance​



目标类型可能包含以返回的距离命名的属性,以(另外)将其直接读回域类型,如下所示。




GeoResults<VenueWithDisField> = template.query(Venue.class) 
.as(VenueWithDisField.class)
.near(NearQuery.near(new GeoJsonPoint(-73.99, 40.73), KILOMETERS))
.all();



用于标识目标集合和潜在查询映射的域类型。

目标类型包含类型的字段。​​dis​​​​Number​

MongoDB支持在数据库中查询地理位置,同时计算与给定原点的距离。使用邻近地理位置查询,您可以表达诸如“查找周围 10 英里内的所有餐馆”之类的查询。为此,请提供采用 aas 参数的方法(以及已经熟悉的实体类型和集合),如以下示例所示:​​MongoOperations​​​​geoNear(…)​​​​NearQuery​

Point location = new Point(-73.99171, 40.738868);
NearQuery query = NearQuery.near(location).maxDistance(new Distance(10, Metrics.MILES));

GeoResults<Restaurant> = operations.geoNear(query, Restaurant.class);

我们使用构建器 API 来设置一个查询,以将给定区域周围的所有实例返回到 10 英里。这里使用的 theenum 实际上实现了一个接口,以便其他指标也可以插入到远处。AI 由乘数支持,可将给定指标的距离值转换为本机距离。此处显示的示例将 10 视为英里。使用其中一个内置指标(英里和公里)会自动触发要在查询上设置的球形标志。如果要避免这种情况,请将普通值传递到。有关更多信息,请参阅JavaDocofand。​​NearQuery​​​​Restaurant​​​​Point​​​​Metrics​​​​Metric​​​​double​​​​maxDistance(…)​​​​NearQuery​​​​Distance​

地理邻近操作返回封装实例的包装器对象。换行允许访问所有结果的平均距离。单个对象携带找到的实体及其与原点的距离。​​GeoResults​​​​GeoResult​​​​GeoResults​​​​GeoResult​

10.6.5. 地理 JSON 支持

MongoDB支持GeoJSON和地理空间数据的简单(传统)坐标对。这些格式既可用于存储数据,也可用于查询数据。请参阅MongoDB关于GeoJSON支持的手册,以了解要求和限制。

域类中的地理 JSON 类型

在域类中使用GeoJSON类型非常简单。包包含诸如,和其他类型。这些类型是现有类型的扩展。以下示例使用:​​org.springframework.data.mongodb.core.geo​​​​GeoJsonPoint​​​​GeoJsonPolygon​​​​org.springframework.data.geo​​​​GeoJsonPoint​

public class Store 

String id;

/**
* location is stored in GeoJSON format.
*
* "type" : "Point",
* "coordinates" : [ x, y ]
*
*/
GeoJsonPoint location;


如果 GeoJSON 对象表示纬度和经对,则经度首先是纬度
因此被视为经度纬度。​​coordinates​​​​GeoJsonPoint​​​​getX()​​​​getY()​


存储库查询方法中的地理 JSON 类型

使用 GeoJSON 类型作为存储库查询参数会在创建查询时强制使用运算符,如以下示例所示:​​$geometry​

public interface StoreRepository extends CrudRepository<Store, String> 

List<Store> findByLocationWithin(Polygon polygon);



/*
*
* "location":
* "$geoWithin":
* "$geometry":
* "type": "Polygon",
* "coordinates": [
* [
* [-73.992514,40.758934],
* [-73.961138,40.760348],
* [-73.991658,40.730006],
* [-73.992514,40.758934]
* ]
* ]
*
*
*
*
*/
repo.findByLocationWithin(
new GeoJsonPolygon(
new Point(-73.992514, 40.758934),
new Point(-73.961138, 40.760348),
new Point(-73.991658, 40.730006),
new Point(-73.992514, 40.758934)));

/*
*
* "location" :
* "$geoWithin" :
* "$polygon" : [ [-73.992514,40.758934] , [-73.961138,40.760348] , [-73.991658,40.730006] ]
*
*
*
*/
repo.findByLocationWithin(
new Polygon(
new Point(-73.992514, 40.758934),
new Point(-73.961138, 40.760348),
new Point(-73.991658, 40.730006)));
以上是关于Spring Data (数据)MongoDB的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Spring-data 中更改/定义 Mongodb 的默认数据库?

spring-data-mongodb 在一个 Mongo 实例中连接多个数据库

Spring Boot 反应式和 mongodb '命令插入需要身份验证'

带有反应式 mongodb 的 Spring Boot 不断尝试连接到 localhost

spring boot mongodb 多数据库

spring data mongodb Query 及分页

(c)2006-2024 SYSTEM All Rights Reserved IT常识