MongoDB $ aggregate $ push multiple fields in Java Spring Data

I have a mongo group group query:

db.wizard.aggregate( { $group: { _id: "$title", versions: { $push: {version:"$version", author:"$author", dateAdded:"$dateAdded"}} } }) 

I need this query in Java Spring -Data-MongoDB, my current solution looks like this:

  Aggregation agg = Aggregation.newAggregation( Aggregation.group("title"). push("version").as("versions") ); 

The problem is that I do not know how to add more fields for the push method (version, author, dateAdded). Is this possible with Spring-Data-MongoDB?

+3
source share
2 answers

Note: MongoDB versiΓ³n 2.6 - 3.0 (compatible Java driver)

I added the org.springframework.data.mongodb.core.aggregation.AggregationOperation class to implement the toDBObject custom method:

 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); } } 

In your case, it will be:

 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(); 

Hope this helps you.

+1
source

You can directly pass a BasicDbObject to any stage of the aggregation pipeline.

 Aggregation agg = newAggregation( group("title"). push(new BasicDBObject ("version", "$version").append ("author", "$author").append ("dateAdded", "$dateAdded")).as("versions")); 
+7
source

All Articles