从 Mongo 查询格式到 java 的投影
Posted
技术标签:
【中文标题】从 Mongo 查询格式到 java 的投影【英文标题】:Projection from Mongo query format to java 【发布时间】:2020-10-02 05:35:00 【问题描述】:我有这个 Aggregation Mongo 查询,但我不知道如何用 Java 编写 Projection 部分。你能帮我解决这个问题吗?
db.getCollection("motion").aggregate(
[
"$match" :
"type" : "NON_PERIODIC_MOTION",
"createdAt" :
"$gte" : ISODate("2020-01-24T23:00:00.000+0000")
,
"minAccAmount" :
"$gte" : 1000.0
,
"$limit" : 200.0
,
"$project" :
"amount" : 1.0,
"createdAt" : 1.0,
"motionExternalId" : 1.0,
"motionRef" : 1.0
,
"$sort" :
"amount" : 1.0
],
"allowDiskUse" : false
);
这是匹配操作部分的代码。
Criteria criterias = new Criteria().andOperator(Criteria.where(Motion.ACCELERATION).gte(minAccAmount)
.and(Motion.TYPE).is(MotionTypeEnum.NON_PERIODIC_MOTION)
.and("createdAt").gte(startDate).lte(endDate));
MatchOperation matchOperation = Aggregation.match(criteria);
【问题讨论】:
您使用find
发布的MongoDB 查询代码不是聚合操作,但您的Java 代码是。 MongoTemplate
有 find
和 aggregate
方法。
发布了正确的查询
投影是使用Aggregation.project() 方法构建的。该方法被重载并接受Fields
或字符串字段名称。as var-args。
【参考方案1】:
试试这个:
import static org.springframework.data.mongodb.core.aggregation.Aggregation.*;
...
@Autowired
protected MongoOperations operations;
...
Criteria criterias = Criteria
.where(Motion.ACCELERATION).gte(minAccAmount)
.and(Motion.TYPE).is(MotionTypeEnum.NON_PERIODIC_MOTION)
.and("createdAt").gte(startDate).lte(endDate);
MatchOperation match = match(criterias);
LimitOperation limit = limit(300);
ProjectionOperation project = project("amount", "createdAt", "motionExternalId","motionRef");
SortOperation sort = sort(Sort.by("amount"));
Aggregation agg = newAggregation(match, limit, project, sort)
.withOptions(Aggregation.newAggregationOptions()
.allowDiskUse(Boolean.TRUE)
.build());
List<Motion> result = operations.aggregate(agg,
operations.getCollectionName(Motion.class), Motion.class).getMappedResults();
【讨论】:
以上是关于从 Mongo 查询格式到 java 的投影的主要内容,如果未能解决你的问题,请参考以下文章
使用 mongoTemplate 在 spring-data-mongo Java 中进行 Mongo 聚合查询
Spring JPA - “java.lang.IllegalArgumentException:投影类型必须是接口!” (使用本机查询)