首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MongoDB $aggregate $push Java Spring数据中的多个字段

MongoDB $aggregate $push Java Spring数据中的多个字段
EN

Stack Overflow用户
提问于 2016-09-08 22:31:25
回答 3查看 12.8K关注 0票数 8

我有一个mongo聚合组查询:

代码语言:javascript
复制
db.wizard.aggregate(
{
$group: {
    _id: "$title",
    versions: { $push: {version:"$version", author:"$author", dateAdded:"$dateAdded"}}
    }
})

我需要Java Spring-Data-MongoDB中的这个查询,我当前的解决方案如下所示:

代码语言:javascript
复制
    Aggregation agg = Aggregation.newAggregation(
            Aggregation.group("title").
                    push("version").as("versions")
    );

问题是我不知道如何给push方法添加更多的字段(version,author,dateAdded)。用Spring-Data-MongoDB可以吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-11-24 22:48:34

您可以将BasicDbObject直接传递到任何聚合管道阶段。

代码语言:javascript
复制
Aggregation agg = newAggregation(
            group("title").
            push(new BasicDBObject
                   ("version", "$version").append
                   ("author", "$author").append
                   ("dateAdded", "$dateAdded")).as("versions"));
票数 14
EN

Stack Overflow用户

发布于 2016-09-09 15:15:56

说明: MongoDB版本2.6 - 3.0 (兼容的Java驱动程序)

我已经扩展了org.springframework.data.mongodb.core.aggregation.AggregationOperation类来实现自定义的toDBObject方法:

代码语言:javascript
复制
public class GenericAggregationOperation implements AggregationOperation {

    private String operator;
    private DBObject query;

    /**
     * Default constructor.
     * 
     * @param operator MongoDB operator ($group, $sort, $project, etc..)
     * @param query MongoDB aggregation query step string
     */
    public GenericAggregationOperation(String operator, String query) {
        this(operator, (DBObject) JSON.parse(query));
    }

    /**
     * Default constructor.
     * 
     * @param operator MongoDB operator ($group, $sort, $project, etc..)
     * @param query MongoDB aggregation query step DBObject
     */
    public GenericAggregationOperation(String operator, DBObject query) {
        this.operator = operator;
        this.query    = query;
    }

    @Override
    public DBObject toDBObject(AggregationOperationContext context) {

        return new BasicDBObject(operator, query);
    }

}

在您的情况下,它将是:

代码语言:javascript
复制
List<AggregationOperation> list = new ArrayList<AggregationOperation>();
lista.add(new GenericAggregationOperation("$group", "{ \"_id\": \"$title\", \"versions\": { \"$push\": { \"version\":\"$version\", \"author\":\"$author\", \"dateAdded\":\"$dateAdded\"}} }"));

TypedAggregation<EpisodeIndexDto> agg = Aggregation.newAggregation(
    YourClassTitleVersion.class, list);
mongoOperations.aggregate(agg, YourClassTitleVersion.class,
    YourClassTitleVersion.class).getMappedResults();

希望这对你有帮助。

票数 4
EN

Stack Overflow用户

发布于 2018-08-01 18:26:36

在新版本spring-data-mongodb:2.x.x中,AggregationOperation需要返回文档而不是DBObject,因此更新后的类将是:

代码语言:javascript
复制
import com.mongodb.BasicDBObject;
import com.mongodb.DBObject;
import org.bson.Document;
import org.springframework.data.mongodb.core.aggregation.AggregationOperation;
import org.springframework.data.mongodb.core.aggregation.AggregationOperationContext;

public class GenericAggregationOperation implements AggregationOperation {

    private String operator;
    private DBObject query;

    public GenericAggregationOperation(String operator, DBObject query) {
        this.operator = operator;
        this.query = query;
    }

    public GenericAggregationOperation(String operator, String query) {
        this(operator, BasicDBObject.parse(query));
    }

    @Override
    public Document toDocument(AggregationOperationContext context) {
        return new Document(operator, query);
    }
}

另外,为了便于使用,我将添加实用程序接口(java 8+,对于java 7或更低版本,您可以将其转换为类utils ):

代码语言:javascript
复制
import com.mongodb.DBObject;
import org.springframework.data.mongodb.core.aggregation.AggregationOperation;

public interface GenericAggregationUtils {

    static AggregationOperation aggregate(String operation, String query) {
        return new GenericAggregationOperation(operation, query);
    }

    static AggregationOperation aggregate(String operation, DBObject query) {
        return new GenericAggregationOperation(operation, query);
    }

}

然后我们可以将接口静态导入到我们的类中:

代码语言:javascript
复制
import static com.example.mongodb.aggregation.GenericAggregationUtils.*;

并在聚合管道中与其他spring数据AggregationOperation一起使用,如下所示:

代码语言:javascript
复制
Aggregation aggregation = newAggregation(YourDocCollection.class,
    aggregate("$group", "{ \"_id\": \"$title\", \"versions\": { \"$push\": { \"version\":\"$version\", \"author\":\"$author\", \"dateAdded\":\"$dateAdded\"}} }"),
    sort(Sort.Direction.ASC, "title"),
    ...
);
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39393672

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档