1.添加依赖
Spring MongoDB支持需要MongoDB 2.6或更高版本,Java SE 8或更高版本。
2.MongoTemplate 查询方式
提供常见的Mongo操作。 包括文档和POJO之间的集成对象映射。
对于大多数任务,您会发现自己使用MongoTemplate或Repository支持,这些支持都利用丰富的映射功能。 MongoTemplate是寻找访问功能的地方,如递增计数器或临时CRUD操作。 MongoTemplate还提供了回调方法,以便您轻松掌握低级API工件(如com.mongo.DB)与MongoDB直接通信。 各种API构件的命名约定的目标是复制基础MongoDB Java驱动程序中的这些元素,以便将现有的知识轻松映射到Spring API上。
3.全文查询
因为MongoDB 2.6的全文查询可以使用$text操作符执行。在TextQuery和TextCriteria中可以使用特定于全文查询的方法和操作。
4.聚合框架支持
Aggregation
聚合表示MongoDB聚合操作,并保存聚合管道指令的描述。聚合是由调用适当的newAggregation(…)的静态工厂方法聚合类将旁边的AggregateOperation列表作为参数可选输入类。
实际的聚合操作是由MongoTemplate的聚合方法执行的,该方法还将所需的输出类作为参数。
AggregationOperation
AggregationOperation代表一个MongoDB聚合流水线操作,并描述了在这个聚合步骤中应该执行的处理。 尽管可以手动创建AggregationOperation,但是构建AggregateOperation的推荐方法是使用Aggregate类提供的静态工厂方法。
AggregationResults
AggregationResults是聚合操作结果的容器。 它以文档形式提供对原始聚合结果的访问,以及对执行聚合的映射对象和信息的访问。
支持的聚合操作
Pipeline Aggregation Operators
Group Aggregation Operators
Boolean Aggregation Operators
Comparison Aggregation Operators
Arithmetic Aggregation Operators
String Aggregation Operators
Date Aggregation Operators
Array Aggregation Operators
Conditional Aggregation Operators
Lookup Aggregation Operators
Pipeline Aggregation Operatorsbucket, bucketAuto, count, facet, geoNear, graphLookup, group, limit, lookup, match, project, replaceRoot, skip, sort, unwind
Set Aggregation OperatorssetEquals, setIntersection, setUnion, setDifference, setIsSubset, anyElementTrue, allElementsTrue
Group Aggregation OperatorsaddToSet, first, last, max, min, avg, push, sum, (*count), stdDevPop, stdDevSamp
Arithmetic Aggregation Operatorsabs, add (*via plus), ceil, divide, exp, floor, ln, log, log10, mod, multiply, pow, sqrt, subtract (*via minus), trunc
String Aggregation Operatorsconcat, substr, toLower, toUpper, stcasecmp, indexOfBytes, indexOfCP, split, strLenBytes, strLenCP, substrCP,
Comparison Aggregation Operatorseq (*via: is), gt, gte, lt, lte, ne
Array Aggregation OperatorsarrayElementAt, concatArrays, filter, in, indexOfArray, isArray, range, reverseArray, reduce, size, slice, zip
Literal Operatorsliteral
Date Aggregation OperatorsdayOfYear, dayOfMonth, dayOfWeek, year, month, week, hour, minute, second, millisecond, dateToString, isoDayOfWeek, isoWeek, isoWeekYear
Variable Operatorsmap
Conditional Aggregation Operatorscond, ifNull, switch
Type Aggregation Operatorstype
Faceted classification
MongoDB支持使用聚合框架的版本3.4分面分类。分面分类使用语义类别(通用或特定主题),将其组合在一起以创建完整的分类条目。流经聚合管道的文档被分类为桶。多方面的分类可以在同一组输入文档上启用各种汇总,而无需多次检索输入文档。
Buckets
Bucket操作根据指定的表达式和Bucket边界将传入文档分组为称为Buckets组。Bucket操作需要分组字段或分组表达式。它们可以通过Aggregate类的bucket()/ bucketAuto()方法来定义。 BucketOperation和BucketAutoOperation可以根据输入文档的聚合表达式来显示累积。 bucket操作可以通过流利的API通过with ...()方法,andOutput(String)方法以及通过as(String)方法进行别名的扩展。每个桶在输出中表示为一个文档。
BucketOperation采用一组定义的边界将传入文档分组到这些类别中。边界需要排序。
5.实例查询
通过实例查询(QBE)是一种简单易用的查询技术。它允许动态查询创建,不需要编写包含字段名的查询。实际上,通过示例查询并不需要使用特定于存储的查询语言编写查询。
Probe:这是一个具有填充字段的域对象的实例。
ExampleMatcher: ExampleMatcher 提供了如何匹配特定字段的详细信息。它可以在多个示例中重用。
Example:一个 Example 由 Probe 和 ExampleMatcher 组成。它用于创建查询。
实例查询,查询适合用例查询,但也有局限性:
什么时候使用:
使用一组静态或动态约束查询数据存储。
频繁地重构域对象,而不必担心破坏现有的查询。
与基础数据存储API独立工作。
限制:
不支持嵌套/分组的属性约束,如firstname = ?0或(firstname = ?1和lastname = ?2)
只支持开始/包含/结束/正则表达式匹配的字符串和精确匹配的其他类型
实例查询使用 repositories 执行。为此,让您的存储库接口扩展QueryByExampleExecutor。
public interfaceAbstractPeopleRepositoryextendsPagingAndSortingRepository,QueryByExampleExecutor{}
查询时需要先构建查询匹配器
6.审计
Spring Data提供了复杂的支持,以透明地跟踪谁创建或更改了一个实体,以及该事件发生的时间点。为了从该功能中获益,您必须为实体类提供审计元数据,这些元数据可以使用注释或实现接口来定义。
AuditorAware
如果您使用的是@CreatedBy或@LastModifiedBy,则审计基础结构需要了解当前的主体。为此,我们提供了一个AuditorAware SPI接口,您必须实现它来告诉基础设施当前用户或系统与应用程序交互的情况。泛型类型T定义了什么类型的属性是由@CreatedBy或@LastModifiedBy来定义的。
基于注解的审计元数据
我们提供@CreatedBy, @LastModifiedBy,以捕获创建或修改该实体的用户,以及@CreatedDate和@LastModifiedDate,以捕获发生此事件的时间点。
classCustomer{
@CreatedBy
privateUseruser;
@CreatedDate
privateDateTimecreatedDate;
// … further properties omitted
}
如您所见,注释可以有选择地应用,这取决于您想要捕获的信息。对于捕获时间点的注释,可以使用类型JodaTimes DateTime的属性、遗留Java日期和日历、JDK8日期/时间类型以及long/ long。
基于接口的审计元数据
如果您不想使用注释来定义审计元数据,您可以让您的域类实现Auditable接口。它为所有审计属性公开setter方法。
还有一个方便的基类AbstractAuditable,您可以扩展它以避免手工实现接口方法的需要。请注意,这增加了您的域类与Spring数据的耦合,这些数据可能是您想要避免的。通常采用基于注释的定义审计元数据的方法,因为它的侵入性较低,且更灵活。
GitHub地址
https://github.com/shaopro/SpringBootMongoDB