简体   繁体   English

Spring Data + MongoDB无效参考错误

[英]Spring Data + MongoDB invalid reference error

Here is my code (Spring data): 这是我的代码(Spring数据):

        MatchOperation matchOperation = Aggregation.match(new Criteria("stats.channelId").is(channelId));

        UnwindOperation unwindOperation = Aggregation.unwind("stats");

        GroupOperation groupOperation = Aggregation.group("id", "discordId")
                .push("stats").as("stats");

        AggregationOperation addFields = (AggregationOperationContext aggregationOperationContext) -> {
                DBObject dbObject =
                        new BasicDBObject("allGamesOnChannel",
                                new BasicDBObject("$sum", "$stats.pickupsPlayed"));
                return new BasicDBObject("$addFields", dbObject);
            };

        SortOperation sortOperation = Aggregation.sort(new Sort(Sort.Direction.DESC, "allGamesOnChannel"));
        LimitOperation limitOperation = Aggregation.limit(maxElements);

        ProjectionOperation projectionOperation = Aggregation.project("id", "discordId", "stats");

        Aggregation aggregation = Aggregation.newAggregation(matchOperation,unwindOperation, matchOperation,groupOperation,addFields,
                sortOperation,limitOperation,projectionOperation);

        AggregationResults<UserSummaryChannel> userSummaries = mongoTemplate.aggregate(aggregation, "pickupUser", UserSummaryChannel.class);

I'm getting this exception while executing above: 我在上面执行时遇到此异常:

Caused by: java.lang.IllegalArgumentException: Invalid reference 'allGamesOnChannel'!
    at org.springframework.data.mongodb.core.aggregation.ExposedFieldsAggregationOperationContext.getReference(ExposedFieldsAggregationOperationContext.java:99) ~[spring-data-mongodb-1.10.10.RELEASE.jar:na]
    at org.springframework.data.mongodb.core.aggregation.ExposedFieldsAggregationOperationContext.getReference(ExposedFieldsAggregationOperationContext.java:80) ~[spring-data-mongodb-1.10.10.RELEASE.jar:na]
    at org.springframework.data.mongodb.core.aggregation.SortOperation.toDBObject(SortOperation.java:73) ~[spring-data-mongodb-1.10.10.RELEASE.jar:na]
    at org.springframework.data.mongodb.core.aggregation.AggregationOperationRenderer.toDBObject(AggregationOperationRenderer.java:56) ~[spring-data-mongodb-1.10.10.RELEASE.jar:na]
    at org.springframework.data.mongodb.core.aggregation.Aggregation.toDbObject(Aggregation.java:580) ~[spring-data-mongodb-1.10.10.RELEASE.jar:na]
    at org.springframework.data.mongodb.core.MongoTemplate$BatchAggregationLoader.prepareAggregationCommand(MongoTemplate.java:2603) ~[spring-data-mongodb-1.10.10.RELEASE.jar:na]
    at org.springframework.data.mongodb.core.MongoTemplate$BatchAggregationLoader.aggregate(MongoTemplate.java:2585) ~[spring-data-mongodb-1.10.10.RELEASE.jar:na]
    at org.springframework.data.mongodb.core.MongoTemplate.aggregate(MongoTemplate.java:1570) ~[spring-data-mongodb-1.10.10.RELEASE.jar:na]
    at org.springframework.data.mongodb.core.MongoTemplate.aggregate(MongoTemplate.java:1511) ~[spring-data-mongodb-1.10.10.RELEASE.jar:na]

Executing aggregation without grouping: 执行聚合而不分组:

Aggregation aggregation = Aggregation.newAggregation(matchOperation,addFields,
            sortOperation,limitOperation,projectionOperation);

gives no error so i assume there is some problem with grouping. 没有错误,所以我认为分组存在问题。 Any ideas what i'm doing wrong here? 有任何想法我在这里做错了吗? Also what i want to do is to filter list of embedded elements, count sum of one of properties of those elements and sort based on it. 我还想做的是过滤嵌入元素的列表,计算那些元素的属性之一的总和,并基于它进行排序。 Maybe there is similar way to do it? 也许有类似的方法吗?

EDIT So here is my document: 编辑所以这是我的文件:

@Document
public class PickupUser {
    @Id
    private String id;
    private String discordId;
    private List<UserModeStats> stats;
    private String name;
}

Embedded object: 嵌入式对象:

@Data
@EqualsAndHashCode(exclude = {"pickupsPlayed", "caps"})
public class UserModeStats {
    public UserModeStats() {}

    private String mode;
    private String channelId;
    private Long pickupsPlayed;
    private Long caps;
}

The output document i would like to create: 我要创建的输出文档:

@Data
public class UserSummaryChannel {
    public UserSummaryChannel() {}

    private String id;
    private String discordId;
    private List<UserModeStats> stats;
    //private Long allGamesOnChannel;
}

I do not want to include allGamesOnChannel property of UserSummaryChannel (aggregation doesn't work with or without that field). 我不希望包括allGamesOnChannel财产UserSummaryChannel (聚集不具有或不具有现场工作)。

This is not a real solution but found the other way to achieve my goal. 这不是真正的解决方案,但找到了实现我目标的另一种方法。 I "implemented" sort operation myself so that insted of this : 我本人“实现”了排序操作,以便对此感兴趣:

SortOperation sortOperation = Aggregation.sort(new Sort(Sort.Direction.DESC, "allGamesOnChannel"));

now i have this: 现在我有这个:

AggregationOperation sortOperation2 = (AggregationOperationContext aggregationOperationContext) -> {
            DBObject dbObject =
                    new BasicDBObject("allGamesOnChannel", 1);
            return new BasicDBObject("$sort", dbObject);
        };

Rest aggregation operations stay same. 其余聚合操作保持不变。 No exceptions are being thrown. 没有异常被抛出。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM