gpt4 book ai didi

java - 在 spring-data-mongodb 中返回 $last 聚合中的对象

转载 作者:太空宇宙 更新时间:2023-11-04 13:34:19 24 4
gpt4 key购买 nike

我想使用 spring-data-mongodb 实现以下查询:

db.getCollection('collection').aggregate([
{ $group: {_id: "$profile", last: { $last: { firstname:"$firstname", lastname:"$lastname"}}}}])

导致这样的结果:

{
"_id": "",
"last": {
"firstname": "",
"lastname": ""
}
}

但是,似乎唯一可用的 API 是

GroupOperation groupOperation = Aggregation.group("profile").last("firstname").as("firstname").last("lastname").as("lastname");

这转化为:

db.getCollection('collection').aggregate([
{ $group: {_id: "$profile", firstname: { $last: "$firstname"}, lastname: { $last: "$lastname"}}}])

给予:

{
"_id": "",
"firstname": "",
"lastname": ""
}

GroupOperation.last(AggregationExpression expr)但我不知道如何使用它。

另一方面,在一个聚合中多次使用 $last 是否会造成性能损失?

最佳答案

是的,当前 spring mongo 聚合助手的构造不允许这样做。但是您可以构造自己的“自定义”聚合操作对象,然后在管道中使用它:

public class CustomAggregationOperation implements AggregationOperation {
private DBObject operation;

public CustomAggregationOperation (DBObject operation) {
this.operation = operation;
}

@Override
public DBObject toDBObject(AggregationOperationContext context) {
return context.getMappedObject(operation);
}
}

这里的用法是:

    Aggregation agg = newAggregation(
new CustomAggregationOperation(
new BasicDBObject("$group",
new BasicDBObject("last",
new BasicDBObject("$last",
new BasicDBObject("fisrname","$firstname")
.append("lastname","$lastname")
)
)
)
)
);

因此,您可以使用 BSON 对象构造函数来按照您想要的方式塑造管道阶段。由于它实现了 AggregationOperation 接口(interface),所以它可以很好地与 group() 和 project() 以及所有其他辅助运算符混合。

关于java - 在 spring-data-mongodb 中返回 $last 聚合中的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31857389/

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