mongodb - How do I use Spring Mongo to group two fields and get a array of one fields based on the other? -
let me give example here:
two entries in collection author:
{ "name" : "joe" "book" : "a" }, { "name" : "joe" "book" : "b" }
now, if use aggregation function in mongo via spring mongo, grab books name joe, coded like:
aggregation agg = newaggregation(map.class, group("name", "book")); aggregationresults<map> results = mongotemplate.aggregate(agg, "author", map.class);
obviously 2 maps way, 1 has entry {"name":"joe", "book": a}
, other has {"name" : "joe", "book" : "b"}
but if want 1 result back, 1 entry :
{"name" : joe, "books" : ["a", "b"]}?
i'm not sure if reachable using 1 query. achieved multiple steps, i'd hate do..
you need use $addtoset
operator in $group
pipeline. return array of unique values ["a", "b"]
results applying $group
expression each document in group of documents share same group key "name"
. in mongo shell have
db.author.aggregate([ { "$group": { "_id": "$name", "books": { "$addtoset": "$book" } } } ]);
which brings desired result
{ "result" : [ { "_id" : "joe", "books" : [ "b", "a" ] } ], "ok" : 1 }
the equivalent spring aggregation:
aggregation agg = newaggregation(map.class, group("name").addtoset("book").as("books")); aggregationresults<map> results = mongotemplate.aggregate(agg, "author", map.class);