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

Schreibe einen Kommentar