java - Spring data Mongo 中用户聚合时排序不起作用

标签 java mongodb spring-data aggregation-framework

我正在尝试对 Spring 数据运行 mongo 聚合 这是示例 json

{
    "id":*****
    "taskResultContent":
    [
        {
            "executionUUID":"uuid_2",
            "sequency":"1",
            "returnContent":"SUCCESS",
        },
        {
            "executionUUID":"uuid_2",
            "sequency":"2",
            "returnContent":"SUCCESS",
        }
    ]
}

这是我的 Mongo 查询

[
    {
        "$match" : {
        "_id" : ObjectId("54767c7cfda0da01d4843e93")
        }
    },
    {
        "$unwind" : "$taskResultContent"
     },
    {
        "$project" : {
            "executionUUID" : "$taskResultContent.executionUUID",
            "returnContent" : "$taskResultContent.returnContent",
            "sequency" : "$taskResultContent.sequency",
            "_id" : 0,
            "resultID" : "$_id"
    }
    },
    {
        "$match" : {
        "executionUUID" : "uuid_3"
        }
    },
    {
        "$sort" : {
        "sequency" : -1
        }
    }
]

这是我的java实现:

Aggregation agg = newAggregation(
                match(Criteria.where("_id").is(objId)),
                unwind("taskResultContent"),
                project("taskResultContent.executionUUID","taskResultContent.returnContent","taskResultContent.sequency").and("resultID").previousOperation(),
                match(Criteria.where("executionUUID").is(executionUUID)),
                sort(DESC,"sequency")
            );

然后我发现一个问题,SORT不起作用。 我从 java 打印出聚合查询。它看起来像:

    {
        "$sort": {
            "taskResultContent.sequency": -1
        }
    }

它应该是“sequerycy”:-1,但不是“taskResultContent.sequency”:-1 有人遇到同样的问题吗?

最佳答案

你会新类(class)

class SortOperationEx implements AggregationOperation {

    private final Sort sort;

    /**
     * Creates a new {@link org.springframework.data.mongodb.core.aggregation.SortOperation} for the given {@link Sort} instance.
     *
     * @param sort must not be {@literal null}.
     */
    public SortOperationEx(Sort sort) {

        Assert.notNull(sort, "Sort must not be null!");
        this.sort = sort;
    }

    public SortOperationEx (Sort.Direction direction, String... fields) {
         this(new Sort(direction, fields));
    }

    public SortOperationEx and(Sort.Direction direction, String... fields) {
        return and(new Sort(direction, fields));
    }

    public SortOperationEx and(Sort sort) {
        return new SortOperationEx(this.sort.and(sort));
    }

    /*
     * (non-Javadoc)
     * @see org.springframework.data.mongodb.core.aggregation.AggregationOperation#toDBObject(org.springframework.data.mongodb.core.aggregation.AggregationOperationContext)
     */
    @Override
    public DBObject toDBObject(AggregationOperationContext context) {

        BasicDBObject object = new BasicDBObject();

        for (Sort.Order order : sort) {

            // Check reference
            String prop = order.getProperty();
            object.put(prop, order.isAscending() ? 1 : -1);
        }

        return new BasicDBObject("$sort", object);
    }
}

并修改代码来自:

Aggregation agg = newAggregation(
                match(Criteria.where("_id").is(objId)),
                unwind("taskResultContent"),
                project("taskResultContent.executionUUID","taskResultContent.returnContent","taskResultContent.sequency").and("resultID").previousOperation(),
                match(Criteria.where("executionUUID").is(executionUUID)),
                sort(DESC,"sequency")
            );

致:

Aggregation agg = newAggregation(
                match(Criteria.where("_id").is(objId)),
                unwind("taskResultContent"),                project("taskResultContent.executionUUID","taskResultContent.returnContent","taskResultContent.sequency").and("resultID").previousOperation(),
                match(Criteria.where("executionUUID").is(executionUUID)),
                 new SortOperationEx(DESC,"sequency")
            ); 

关于java - Spring data Mongo 中用户聚合时排序不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27162088/

相关文章:

java - 使用图像制作自定义 JScrollBar

c# - 任何人都可以解释下面一段 Windows 匿名/恶作剧代码吗?

java - 调试器将无法到达断点 - 而是引发异常

node.js - 如何从 Mongoose 的 DeleteMany 中间件中获取已删除的文档?

java - 当我尝试在 Spring Boot 和 MVC 中使用 get 映射时出现异常

java - Android TCP 连接到 C 服务器 : String transferred is noisy

spring - MongoDB - 考虑在您的配置中定义类型为 'org.springframework.data.mongodb.repository.query.MongoEntityInformation' 的 bean

javascript - 如何通过http从mongoDB发送大量文档?

java - StringRedisTemplate如何使用redis zcard方法?

java - 在 Spring 应用程序中使用或测试时如何将参数传递给 Spring 存储库