java - Spring data mongodb simulate ifNull behavior -


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