1. BasicDBObject
Die gesamte Aggregationsabfrage besteht darin, die Anzahl der Benutzer in verschiedenen Benutzerzuständen als Szenarien zu zählen:
1. Filterkriterien:
Datum ist das Abfragedatum:
BasicDBObject query = new BasicDBObject (); Query.put ("time", new BasicDBObject ("$ gte", Datum + "00:00:00") .And ("$ lte", Datum + "23:59:59"));Wenn es mehrere Bedingungen gibt: Abfrage hinzufügen.put ("Status", 0);
Wenn es vorhanden ist oder Filter:
BasicDblist Values = new BasicDblist (); values.add (new BasicDBObject ("Status", New BasicDBObject ("$ existiert", false)); values.add (new BasicDBObject ("Status", 0)); query.put ("$ oder", Werte);Wenn ein neues BasicDBObject ("$ existiert", false)) bedeutet, dass "Status" nicht vorhanden ist (MongoDB -Dokument kann keinem Entitätsfeld gleich sein)
2. Spleißspiel
DBObject match = new BasicDBObject ("$ match", Abfrage);Legen Sie die vorherige Abfrage in den Macth -Filter ein
3.. Spleiß- und Gruppierungsbedingungen
Dieser Schritt entspricht der SQL Group von
BasicDBObject GroupBy = new BasicDBObject (); // Gruppierungsbedingungen GroupBy.put ("userId", "$ userId"); // Gruppe gemäß der Benutzer -IDWie bei dem Filterschritt im ersten Schritt können Sie diese, wenn es mehrere Gruppen gibt, sie direkt zu Folgendem hinzufügen: GroupBy.put ("Status", "$ status");
4. Nach-Gruppen-Abfrage
Spleißen Sie zuerst die Gruppierungen an:
DBObject select = new BasicDBObject ("_ id", GroupBy);Wenn wir mit den gruppierten Daten arbeiten möchten: (Hier ist die Statistik der Benutzer)
Select.put ("count", New BasicDBObject ("$ sum", 1));5. Splice $ Group
DBObject Group = new BasicDBObject ("$ gruppe", select);Bis jetzt. Lassen Sie uns hier die MongoDB -Anweisung enden
Beginnen wir den Abfragebetrieb:
importieren com.mongodb.aggregationOutput; import org.springframework.data.mongodb.core.mongotemplate; aggregationOutput output = mongotemplate.getCollection ("Hier ist der Name der Datentabelle, mongoDb") .Aggregate (Übereinstimmung, Gruppe);Lesen Sie das Abfrageergebnis:
Iterable <DBObject> map = output.results (); // transip mapFor (dBObject dBObject: map) {// Die hier gelesene Karte lautet {"_id": {"userId": 1, "Status" 0}} ... map <string, Objekt> resultmap = (MAP <string, Objekt>) dbobject.get ("_ id"). //Transfer.0 Integer userId = integer.parseInt (commutil.toString (auSgmap.get ("userId")). Ersetzen (". 0", ""); // Hier können wir mit unseren Daten arbeiten. Integer count = Integer.ParseInt (commutil.toString (dBObject.get ("count"))); }2. DBObject
Wenn Sie der Meinung sind, dass die erste Methode besonders langfristig ist, werde ich Ihnen eine prägnantere Aggregationsabfrage mit einem prägnanteren Code bringen:
Laden Sie einfach den Code hoch.
1. Achten Sie auf das importierte Paket:
import com.mongodb.dbobject; import com.mongodb.util.json;
2. $ macth:
(Beginday-Query-Startdatum; Endday-Query-Enddatum)
DBObject match = (dbObject) json.parse ("{$ match: {'status': '1', 'time': {$ gte: '"+Beginday+"', $ lte: '"+endday+"'}}}");3. $ gruppe:
(GROPPERSE nach UserID, zählen Sie die Anzahl der Benutzer, akkumulieren Sie den Ama -Feldwert und nehmen Sie den Maximalwert des Feldes AMOUT)
DBObject Group = (dBObject) json.parse ("{$ gruppe: {_ id: '$ userId', count: {$ summe: 1}, insgesamt: {$ sum: '$ betragen'}, maxSsigle: {$ max: '$ betragen'}}}}}");Nachdem die Bedingungen gespleißt sind, beginnen Sie mit Abfragen:
Liste <DBObject> list = new ArrayList <DBObject> (); list.add (Match); list.add (Gruppe); AggregationOutput output = mongotemplate.getCollection ("Tabellenname"). Aggregat (Liste);Es ist nicht erforderlich, über das Traversal -Ergebnis zu sprechen. Das obige wurde ausführlich beschrieben
Ist die zweite Methode viel einfacher als die andere? Aber es testet die Vertrautheit mit MongoDB -Aussagen.
【Erweitert】
Dann erweitert sich die obige Methode
// Status beträgt 0 oder 1; Typ nicht 11; TIME DBOBJECT MATCH = (DBOBJECT) JSON.PARSE ("{$ Match: {'Status': {$ in: ['0', '1']}, Typ: {$ ne: 11}, 'time': {$ gte: '+Beginday+"', $ lte '+endday+'}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}. the last time DBObject group = (DBObject) JSON.parse("{$group:{_id:'$userId', count:{$sum:1},lastTime:{$max:'$time'} }}");//In the results counted in the previous step, data with filtering times greater than 100 times DBObject groupMatch = (DBObject) Json.parse ("{$ Match: {count: {$ gte: 100}}}"); // $ project ----- Welche Felder sollten im Abfrageergebnis angezeigt werden, und das Display ist auf 1. Das _id-Feld (Feld) muss nicht wie folgt angezeigt werden. Sammlungsname.Aggregate ([{$ project: _id: 0, count: 1, lastSucctime: 1}}]) dBObject project = (dbObject) json.parse ("{$ project: _ id: 1, count: 1, lastScctime: 1}}}"); JSON.parse("{$sort:{'count':-1}}");//Sorting List<DBObject> list = new ArrayList<DBObject>();list.add(match);list.add(group);list.add(groupMatch);list.add(project);list.add(sort);AggregationOutput catchOutPut = mongoTemplate.getCollection("table Name ") .Aggregate (Liste); // Abfragenergebnisse8. BasicDBObject+Skript -Anweisung
BasicDBObject GroupIndex = new BasicDBObject (); BasicDBObject DifferQuery = new BasicDBObject (); Differenzierung.put ("userId", new BasicDBObject ("$ in", userIDs); // userIDS -Array -BasicDBObject initiDex = new BasicDbobject (). Daten der Datenbank.Prev repräsentiert das Abfrageergebnis // PREV.Count Die Anzahl ist die Anzahl der vorherigen Schritt initiNeIndex) String record = "function (doc, prev) {if (doc.status == 0) {prev.count+= 1;};}"; list <map <String, Objekt >> BasicDblist = (List <Map <map <map <map <map <map <map <map <map <map <map <map <map <map <map < GetCollection ("Sammlung"). Gruppe (GroupIndex, UnterschiedsQuery, InitIndex, Reduzierung, NULL);Schließlich können Sie das Ergebnis erzielen, indem Sie die Liste durchlaufen. [PS: Es gibt eine Einschränkung dieser Aggregationsmethode der Gruppe ---> Es wird ein Fehler auftreten, wenn sie 20.000 Daten überschreitet.
Das oben genannte ist das, was ich in der mongoDB -Aggregationsverarbeitung in der gewöhnlichen Geschäftsabwicklung verwende. Wenn es eine bessere Methode gibt oder etwas, das verbessert werden muss, hinterlassen Sie mir bitte eine Nachricht ~ ~