i have collection of forms:
{ "_id" : { "$oid" : "57050f22d5f79d2e6866c6f8" }, "form_name" : "form 1", "ver" : 0, "createdat" : { "$date" : 1459950030037 } } { "_id" : { "$oid" : "57050fa6d5f79d2e6866c6f9" }, "form_name" : "form 1", "ver" : 1, "vid" : { "$oid" : "57050f22d5f79d2e6866c6f8" }, "createdat" : { "$date" : 1459950030037 } } { "_id" : { "$oid" : "57050ff2d5f79d2e6866c6fa" }, "form_name" : "form 1", "ver" : 2, "vid" : { "$oid" : "57050f22d5f79d2e6866c6f8" }, "createdat" : { "$date" : 1459950030037 } } { "_id" : { "$oid" : "570511ced5f79d2e6866c6fb" }, "form_name" : "form 2", "ver" : 0, "createdat" : { "$date" : 1459950030037 } }
i'm getting versioned forms follows:
db.forms.aggregate([ {"$match":{"deletedat":{"$exists":false}}}, {"$sort":{"createdat":1}}, {"$group":{ "_id": {"$ifnull":["$vid", "$_id"]}, "vid":{"$push":"$$root"} } } ])
and i'm getting such json answer:
[ { "_id" : objectid("57050f22d5f79d2e6866c6f8"), "vid" : [ { "_id" : objectid("57050f22d5f79d2e6866c6f8"), "form_name" : "form 1", "ver" : 0, "createdat" : isodate("2016-04-06t13:29:06.079z") }, { "_id" : objectid("57050fa6d5f79d2e6866c6f9"), "form_name" : "form 1", "ver" : 1, "createdat" : isodate("2016-04-06t13:31:18.742z"), "vid" : objectid("57050f22d5f79d2e6866c6f8") }, { "_id" : objectid("57050ff2d5f79d2e6866c6fa"), "form_name" : "form 1", "ver" : 2, "createdat" : isodate("2016-04-06t13:32:34.986z"), "vid" : objectid("57050f22d5f79d2e6866c6f8") } ] }, { "_id" : objectid("570511ced5f79d2e6866c6fb"), "vid" : [ { "_id" : objectid("570511ced5f79d2e6866c6fb"), "form_name" : "form 2", "ver" : 0, "createdat" : isodate("2016-04-06t13:40:30.037z") } ] } ]
in java end i'm doing follows:
list<dbobject> tmpaggr = new arraylist<>(); tmpaggr.add(new basicdbobject("$match", new basicdbobject("deletedat", new basicdbobject("$exists", false)))); tmpaggr.add(new basicdbobject("$sort", new basicdbobject("createdat", 1))); tmpaggr.add(new basicdbobject("$group", basicdbobjectbuilder.start("_id", new basicdbobject("$ifnull", new string[]{"$vid", "$_id"})) .append("vid", new basicdbobject("$push", "$$root")).get())); tmpaggr.add(new basicdbobject("$sort", new basicdbobject("_id", 1))); list_with_versions = collections.unmodifiablelist(tmpaggr); org.getdb().getcollection("forms").aggregate(list_with_versions).results()
how reproduce behavior spring data mongodb framework? problem there no ifnull construction. how manage issue?
you create workaround implements aggregationoperation interface take in dbobject
represents single operation in aggregation pipeline $ifnull
operator:
public class groupaggregationoperation implements aggregationoperation { private dbobject operation; public groupaggregationoperation (dbobject operation) { this.operation = operation; } @override public dbobject todbobject(aggregationoperationcontext context) { return context.getmappedobject(operation); } }
then implement $group
operation dbobject in aggregation pipeline same 1 have:
dbobject operation = (dbobject) new basicdbobject( "$group", basicdbobjectbuilder.start( "_id", new basicdbobject( "$ifnull", new string[]{"$vid", "$_id"} ) ) .append("vid", new basicdbobject("$push", "$$root")) .get() );
which can use as:
import static org.springframework.data.mongodb.core.aggregation.aggregation.*; groupaggregationoperation groupop = new groupaggregationoperation(operation); aggregation agg = newaggregation( match(criteria.where("deletedat").exists(false)), sort(asc, "deletedat"), groupop ); aggregationresults<forms> results = mongotemplate.aggregate(agg, forms.class); list<forms> forms = results.getmappedresults();
Comments
Post a Comment