gpt4 book ai didi

java - 如何在聚合中映射_id参数

转载 作者:太空宇宙 更新时间:2023-11-04 10:46:32 25 4
gpt4 key购买 nike

我定义了一种使用聚合框架对数据进行分组的方法。该方法接受可以对数据进行分组的字段列表。我还创建了一个类来映射结果,但问题是我不知道为 _id 属性指定什么类型。根据用于对数据进行分组的字段数量,_id 可以具有不同的类型。我尝试了 Object 但它仅在与零个或一个字段分组时有效,但在使用多个字段时无效。

public List<Metric> getMetric(List<String> fields) {
MatchOperation match = match(where("status").in("WIN", "LOSS", "PUSH").and("year").gte(2015));
GroupOperation group = group(fields.toArray(new String[0]))
.count().as("count")
.avg("odd").as("averageOdd")
.sum("profit").as("profit")
.push("$$ROOT").as("picks");
Aggregation aggregation = Aggregation.newAggregation(
match,
group
);
// TODO: Handle _id
AggregationResults<Metric> aggregationResults = mongoTemplate.aggregate(aggregation, "pick", Metric.class);
return aggregationResults.getMappedResults();
}

public class Metric {

// private Map<String, Object> _id;
// private List<Object> _id;
private Object _id;

private Integer count;

private Double profit;

private Double averageOdd;

}

使用空列表,结果(方法返回的列表的 JSON 表示形式)为:

[
{
"_id": null,
"count": 1997,
"profit": -0.07237707390649417,
"averageOdd": 2.4241016559624624,
"yield": -0.00003624290130520489
}
]

使用一个字段,部分结果为:

[
{
"_id": 2016,
"count": 751,
"profit": -34.484,
"averageOdd": 2.362993342210386,
"yield": -0.04591744340878828
}
]

使用多个字段,部分结果为:

[
{
"_id": null,
"count": 211,
"profit": -18.961,
"averageOdd": 3.1104597156398106,
"yield": -0.08986255924170615
}
]

最佳答案

我找到了一种将 _id 映射到多个字段的方法。在映射对象中,您必须声明组成 _id 的字段。

_id: {
sport: "MLB",
year: 2016
}

在映射对象中,您必须声明字段sportyear。不太方便的部分是您必须将 _id 保留在映射对象中才能处理单个字段 _id 的情况,即使它是逻辑。

来自MongoTemplate的相关代码:

class UnwrapAndReadDbObjectCallback<T> extends MongoTemplate.ReadDbObjectCallback<T> {
public UnwrapAndReadDbObjectCallback(EntityReader<? super T, DBObject> this$0, Class<T> reader, String type) {
super(reader, type, collectionName);
}

public T doWith(DBObject object) {
Object idField = object.get("_id");
if (!(idField instanceof DBObject)) {
return super.doWith(object);
} else {
DBObject toMap = new BasicDBObject();
DBObject nested = (DBObject)idField;
toMap.putAll(nested);
Iterator var5 = object.keySet().iterator();

while(var5.hasNext()) {
String key = (String)var5.next();
if (!"_id".equals(key)) {
toMap.put(key, object.get(key));
}
}

return super.doWith(toMap);
}
}
}

关于java - 如何在聚合中映射_id参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48357812/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com