[英]Spring Data + MongoDB invalid reference error
這是我的代碼(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);
我在上面執行時遇到此異常:
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]
執行聚合而不分組:
Aggregation aggregation = Aggregation.newAggregation(matchOperation,addFields,
sortOperation,limitOperation,projectionOperation);
沒有錯誤,所以我認為分組存在問題。 有任何想法我在這里做錯了嗎? 我還想做的是過濾嵌入元素的列表,計算那些元素的屬性之一的總和,並基於它進行排序。 也許有類似的方法嗎?
編輯所以這是我的文件:
@Document
public class PickupUser {
@Id
private String id;
private String discordId;
private List<UserModeStats> stats;
private String name;
}
嵌入式對象:
@Data
@EqualsAndHashCode(exclude = {"pickupsPlayed", "caps"})
public class UserModeStats {
public UserModeStats() {}
private String mode;
private String channelId;
private Long pickupsPlayed;
private Long caps;
}
我要創建的輸出文檔:
@Data
public class UserSummaryChannel {
public UserSummaryChannel() {}
private String id;
private String discordId;
private List<UserModeStats> stats;
//private Long allGamesOnChannel;
}
我不希望包括allGamesOnChannel
財產UserSummaryChannel
(聚集不具有或不具有現場工作)。
這不是真正的解決方案,但找到了實現我目標的另一種方法。 我本人“實現”了排序操作,以便對此感興趣:
SortOperation sortOperation = Aggregation.sort(new Sort(Sort.Direction.DESC, "allGamesOnChannel"));
現在我有這個:
AggregationOperation sortOperation2 = (AggregationOperationContext aggregationOperationContext) -> {
DBObject dbObject =
new BasicDBObject("allGamesOnChannel", 1);
return new BasicDBObject("$sort", dbObject);
};
其余聚合操作保持不變。 沒有異常被拋出。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.