Spring Data (数据)MongoDB
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring Data (数据)MongoDB相关的知识,希望对你有一定的参考价值。
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)
Criteria
key
Criteria
-
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
$jsonSchema
properties
-
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")
结果将包含两者和过孔。 |
结果将仅包含过孔。 |
结果将包含和整个对象通过。 |
结果将包含仅包含字段 via 的 and 和对象。 |
从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");
使用本机表达式。使用的字段名称必须引用数据库文档中的字段名称。 |
指定表达式结果投影到的字段名称。生成的字段名称不会针对域模型进行映射。 |
使用一个。除本机名称外,字段名称将映射到域模型中使用的字段名称。 |
使用 SpEL 和 anto 调用表达式函数。字段名称将映射到域模型中使用的字段名称。 |
@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();
查询集合。 |
选择字段的不同值。字段名称根据域类型属性声明进行映射,同时考虑潜在的注释。 |
检索所有非重复值作为 aof(由于未指定显式结果类型)。 |
将非重复值检索到 aofis 是最灵活的方法,因为它尝试确定域类型的属性值并将结果转换为所需的类型或映射结构。Collection
Object
Document
有时,当所需字段的所有值都固定为某个类型时,直接获取正确键入的值会更方便,如以下示例所示:Collection
例 71。检索强类型非重复值
template.query(Person.class)
.distinct("lastname")
.as(String.class)
.all();
查询集合。 |
选择字段的不同值。字段名称根据域类型属性声明进行映射,同时考虑潜在的注释。 |
检索到的值将转换为所需的目标类型 — 在本例中为。如果存储的字段包含文档,也可以将值映射到更复杂的类型。 |
检索所有非重复值作为 aof。如果无法将类型转换为所需的目标类型,则此方法将引发 a。 |
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 中更改! Spring Data MongoDB 2.2使用聚合而不是命令来运行一个。 以前在包装器类型中返回的计算距离(使用 geoNear 命令时)现在嵌入在包装器类型中 到生成的文档中。 如果给定的域类型已包含具有该名称的属性,则计算的距离 使用可能随机的后缀命名。 目标类型可能包含以返回的距离命名的属性,以(另外)将其直接读回域类型,如下所示。 GeoResults<VenueWithDisField> = template.query(Venue.class) |
用于标识目标集合和潜在查询映射的域类型。 |
目标类型包含类型的字段。 |
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 对象表示纬度和经度对,则经度首先是纬度。 |
存储库查询方法中的地理 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)));