从 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 代码是。 MongoTemplatefindaggregate 方法。 发布了正确的查询 投影是使用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 的投影的主要内容,如果未能解决你的问题,请参考以下文章

从本机查询返回单个投影

mongo 进阶——查询 - 掘金

mongo 进阶——查询 - 掘金

使用 mongoTemplate 在 spring-data-mongo Java 中进行 Mongo 聚合查询

天啦,从Mongo到ClickHouse我到底经历了什么?

Spring JPA - “java.lang.IllegalArgumentException:投影类型必须是接口!” (使用本机查询)