1

Hallo allerseits Ich habe ein großes Problem bei der Abfrage meiner Daten. Ich habe Dokumente wie folgt aus:Aggregation Abfrage in Mongo und Feder-Daten-Mongo

{ 
    "_id" : NumberLong(999789748357864), 
    "text" : "#asd #weila #asd2 welcome in my house", 
    "date" : ISODate("2016-12-13T21:44:37.000Z"), 
    "dateString" : "2016-12-13", 
    "hashtags" : [ 
     "asd", 
     "weila", 
     "asd2" 
    ] 
} 

und ich möchte zwei Abfragen erstellen:

1) für jeden Tag die Anzahl der hashtag zählen und wie dies zum Beispiel etwas raus:

{_id:"2016-12-13", 
hashtags:[ 
{hashtag:"asd",count:20}, 
{hashtag:"weila",count:18}, 
{hashtag:"asd2",count:10}, 
.... 
] 
} 

{_id:"2016-12-14", 
hashtags:[ 
{hashtag:"asd",count:18}, 
{hashtag:"asd2",count:14}, 
{hashtag:"weila",count:10}, 
.... 
] 
} 

2) ein anderes ist das gleiche, aber ich möchte einen Zeitraum von 2016-12-13 bis 2016-12-17 festlegen.

Für den ersten schreibe ich diese Abfrage und ich bekomme, was ich suche, aber in Spring Data Mongo kann ich nicht schreiben.

db.comment.aggregate([ 
{$unwind:"$hashtags"}, 
{"$group":{ 
    "_id":{ 
     "date" : "$dateString", 
     "hashtag": "$hashtags" 
    }, 
    "count":{"$sum":1} 
    } 
}, 
{"$group":{ 
    "_id": "$_id.date", 
    "hashtags": { 
     "$push": { 
     "hashtag": "$_id.hashtag", 
     "count": "$count" 
    }}, 
    "count": { "$sum": "$count" } 
}}, 
{"$sort": { count: -1}}, 
{"$unwind": "$hashtags"}, 
{"$sort": { "count": -1, "hashtags.count": -1}}, 
{"$group": { 
     "_id": "$_id", 
     "hashtags": { "$push": "$hashtags" }, 
     "count": { "$first": "$count" } 
    }}, 
{$project:{name:1,hashtags: { $slice: ["$hashtags", 2 ]}}} 
]); 

Antwort

0

Sie noch einen Bruchteil der gleichen Aggregation Betrieb abzüglich der Pipeline Schritte nach der zweiten Gruppenphase aber für die Filterung Aspekt verwenden, können Sie einen Datumsbereich Abfrage in einer ersten $match Pipeline Schritt einzuführen haben würde .

Die folgenden Mongo Mantel Beispiele zeigen, wie Sie die Aggregate für einen bestimmten Zeitraum filtern:

1) Stellen Sie einen Zeitraum von 2016.12.13 bis 2016.12.14:

var startDate = new Date("2016-12-13"); 
startDate.setHours(0,0,0,0); 

var endDate = new Date("2016-12-14"); 
endDate.setHours(23,59,59,999); 
var pipeline = [ 
    { 
     "$match": { 
      "date": { "$gte": startDate, "$lte": endDate } 
     } 
    } 
    { "$unwind": "$hashtags" }, 
    { 
     "$group": { 
      "_id": { 
       "date": "$dateString", 
       "hashtag": "$hashtags" 
      }, 
      "count": { "$sum": 1 } 
     } 
    }, 
    { 
     "$group": { 
      "_id": "$_id.date", 
      "hashtags": { 
       "$push": { 
        "hashtag": "$_id.hashtag", 
        "count": "$count" 
       } 
      } 
     } 
    } 
] 
db.comment.aggregate(pipeline) 
Set

2) 2016.12.17 einen Zeitraum von 2016.12.13 bis:

var startDate = new Date("2016-12-13"); 
startDate.setHours(0,0,0,0); 

var endDate = new Date("2016-12-17"); 
endDate.setHours(23,59,59,999); 
// run the same pipeline as above but with the date range query set as required 

Spring Data Equivalent (ungetestet):

+0

Vielen Dank für Ihre Antwort @chridam, ich realisiere die gleiche Sache und arbeite gut, aber mit dieser Lösung muss ich eine Abfrage für jeden Tag machen. Im Fall 2 ist es perfekt. Wissen Sie, wie Sie das Hashtag-Array in Spring Data aufteilen, um nur die ersten zehn Elemente zu erhalten? In mongo sortiere ich die Zählung und mache danach eine Projektion. {$ Project: {name: 1, hashtags: {$ slice: ["$ hashtags", 2]}}} aber $ slice ist für die von mir verwendete Version nicht implementiert . Ich muss die innere Struktur sortieren und sie begrenzen, aber im Frühjahr Daten Mongo Ich weiß nicht, wie zu tun, Irgendwelche Vorschläge? – dantavo

+0

Fügen Sie dieses 'Projekt (" Name "). Und (" Hashtags "). Projekt (" Slice ", 2))' nach der Gruppe in der Aggregation Abfrage – Veeram

+0

Vielen Dank @SagarReddy, löse ich das Problem auf eine seltsame Art und Weise Das Ergebnis ist richtig. Ich habe ein Limit (2) vor dem zweiten Gruppenschritt in der Aggregationsfunktion gesetzt, aber ich werde diese Anweisung mit der ändern, die Sie mir vorschlagen;) – dantavo

Verwandte Themen