Aggregation Summe in Spring Data MongoDB
Habe ich MongoDB Seite und Post-Kollektionen. Jede Seite hat Feld postIds, welche ist array von post-Ids (String-Objekte). Ich möchte an aggregation auf Anzahl der Beiträge (=Anzahl der Elemente im array postIds) für jede Seite. Ich schrieb Mongo-Shell-aggregation-Funktion liefert genau das, was ich will:
db.page.aggregate([
{$unwind : '$postIds'},
{$group : {_id: '$_id', 'sum': { $sum: 1}}}
])
und es gibt zu diesem Ergebnis:
{ "_id" : "3", "sum" : 3 }
{ "_id" : "2", "sum" : 3 }
Dies bedeutet, dass die Seite mit der id 3 hat 3 posts und die Seite mit der id 2 hat 3 Beiträge, das ist richtig.
Nun wollte ich schreiben, gleich mit Spring MongoDB Aggregation, und schrieb diese einfache JUnit-test:
/**
* Test page posts count
*/
@Test
public void testPagePostsCount() throws Exception{
MongoTemplate template = repository.getMongoTemplate();
Page page = new Page();
page.setPageId("2210");
page.setUserId("azec");
List<String> postList = new ArrayList<String>();
postList.add("53eb1a560efbe048c7ea698d");
postList.add("53eb1a6b0efbe048c7ea698e");
page.setPostIds(postList);
template.save(page);
Aggregation agg = newAggregation(
match(Criteria.where("pageId").is("2210")),
unwind("postIds"),
group("_id").sum("1").as("sum")
//project("$sum").and("pageId").previousOperation()
);
AggregationResults<PostCount> results = template.aggregate(agg, "page", PostCount.class);
List<PostCount> postCount = results.getMappedResults();
System.out.println("Done!");
}
Jedoch, diese aggregation Abfrage gibt das native Mongo-Abfrage:
2014-08-13 20:06:07,949 DEBUG [org.springframework.Daten.mongodb.core.MongoTemplate] - Ausführen-aggregation:
{
"aggregate":"page",
"pipeline":[
{
"$match":{
"pageId":"2210"
}
},
{
"$unwind":"$postIds"
},
{
"$group":{
"_id":"$_id",
"sum":{
"$sum":"$1"
}
}
}
]
}
Fragen:
1. Wie Sie sehen können, der Unterschied ist mit dem $Summe den Wert von $1. Ich übergeben zu müssen, es die Zahl 1 anstelle von $1, aber ich bin nicht sicher, wie.
2. Brauche ich Projekt-Betrieb hier?
Dank
InformationsquelleAutor azec-pdx | 2014-08-13
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich dachte, dies endlich. Der Schlüssel ist, verwenden Sie count() Aggregationsfunktion im Frühjahr die Daten für MongoDB, die übersetzt, um die Summe in Schritten von 1 im nativen Mongo-shell. Dies ist meine Letzte JUnit-Test:
So dass schließlich dies führt zu folgenden einheitlichen aggregation Betrieb:
InformationsquelleAutor azec-pdx