改进聚合查询以获得不同的结果

米兰波佩斯库:

我有一个聚合查询,该查询返回Operation字段的范围amount:BigDecimal大于minAmount且在日期范围内的Operation对象operationId:String基于,我只想得到不同的结果(每个对象都有一个operationId

我在这里找到了一个相关示例,但它并不能帮助我解决问题:使用MongoTemplate获取排序的不同值

我了解addToSetgroup可以使用,但尚不清楚如何在其余查询中准确地整合它

    private List<OperationDataVO> getInfoFromDB(BigDecimal minAmount,
                                                     Instant startDate, Instant endDate) {
        Criteria criterias = new Criteria()
            .andOperator(Criteria.where(WinningOperation.AMOUNT)
                    .gte(minAmount)
                    .and(Operation.TYPE).is(OperationTypeEnum.WINNING_TYPE)
                    .and("createdAt").gte(startDate).lte(endDate));

        MatchOperation matchOperation = Aggregation.match(criterias);

        ProjectionOperation projectionOperation = 
                Aggregation.project("amount", "operationId");

        Aggregation aggregation = Aggregation.newAggregation(matchOperation,
                projectionOperation, sort(direction, "amount"));

        AggregationResults<OperationDataVO> aggregate = mongoTemplate
                .aggregate(aggregation, COLLECTION, OperationDataVO.class);

        return aggregate.getMappedResults();
    }

另外,我尝试在Aggregation管道中添加组操作,但是这样做时,我得到了OperationDataVO每个对象的两个字段都在哪里的列表null

Aggregation aggregation = Aggregation.newAggregation(matchOperation, projectionOperation, sort(direction, "amount"), group("operationId"));

赫尔曼:

amount在进行分组之前,您需要按降序排序分组应使用“ $ first”累加器完成。我们使用保留整个文档$$ROOT然后,可以用组中的文档替换根文档。

分组不会保留任何顺序,因为您要对最终结果进行排序,因此需要再次排序。

实现此目的的mongo shell代码如下所示:

db.getCollection('operationData').aggregate([
{ $match: ... } ,
{ $project: { amount: 1, operationId: 1 } },
{ $sort: { amount: -1 } },
{ $group: { _id: '$operationId', g: { $first: {data: '$$ROOT'} }} },
{ $replaceRoot: { newRoot: '$g.data' }},
{ $sort: { amount: 1 } }
])

这将需要转换为Spring Data Mongo(也许我以后会花时间尝试一下)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在CakePHP查询中获得不同的DISTINCT结果

无法从mysql查询中获得不同的结果?

MongoTemplate聚合获得不同的值

Django postgres查询结果针对不同的数据库字段获得不同的结果

从Oracle中的子查询的有序结果中获得不同的结果

如何在codeigniter中使用嵌套的选择查询以使每个查询获得不同的结果

如何迭代对象以获得不同的结果?

反射-从HashMap获得不同的结果-LinkedHashMap

Keras与定种子获得不同的结果

Java AES加密获得不同的结果

每次从BeautifulSoup获得不同的结果

如何用一条语句获得不同的查询(模型)结果?-laravel

逐行执行查询时在neo4j中获得不同的结果

使用mongo和mongoClient从同一查询中获得不同的投影结果

在 T-SQL 和 LINQ (EF Core) 中使用相同的查询获得不同的结果

根据变量的值从同一查询中获得不同的结果

从邮递员获得的OKHTTP上获得不同的结果

使用多线程在不同的运行中获得不同的结果

Flutter - 如何使用相同的未来获得不同的结果?

对于getStackTrace()[2] .getMethodName()获得不同的结果

使用%dopar%和%do%获得不同的结果

使用ggplot和基本绘图功能获得不同的结果

使用RDD和DataFrames获得不同的结果

Array.sort在iOS中获得不同的结果

使用Sparklyr和Dplyr时获得不同的结果

在 mysql 中使用更多条件获得不同的结果

SWIFT AES加密和解密-获得不同的结果

连接表时无法获得不同的结果

在Angular 7中获得不同的params值结果