1. BasicDBObject
L'ensemble de la requête d'agrégation est de compter le nombre d'utilisateurs dans divers états d'utilisateurs comme scénarios:
1. Critères de filtre:
La date est la date de requête:
BasicDBObject Query = new BasicDBObject (); Query.put ("heure", new BasicDBObject ("$ gte", date + "00:00:00") .Apnd ("$ lte", date + "23:59:59"));S'il y a plusieurs conditions: ajouter query.put ("statut", 0);
S'il y a ou filtre:
BasicDBlist Values = new BasicDBlist (); valeurs.add (new BasicDBObject ("Status", new BasicDBObject ("$ existe", false))); valeurs.add (new BasicDBObject ("Status", 0)); query.put ("$ ou", valeurs);Lorsque le nouveau BasicDbObject ("$ existe", False)) signifie que "Status" n'existe pas (le document MongoDB ne peut pas être égal à un champ d'entité)
2. Match d'épissage
DbObject Match = new BasicDBObject ("$ correspond", requête);Mettez la requête précédente dans le filtre Macth
3. Conditions d'épissage et de regroupement
Cette étape équivaut à SQL Group par
BasicDbObject GroupBy = new BasicDbObject (); // Grouping Conditions GroupBy.put ("UserId", "$ UserId"); // GROUPEL Selon l'identifiant de l'utilisateurComme l'étape de filtrage dans la première étape, s'il y a plusieurs groupes, vous pouvez les ajouter directement à ce qui suit: groupby.put ("statut", "$ statut");
4. Requête post-groupe
Épissez d'abord les groupements:
DbObject select = new BasicDBObject ("_ id", groupby);Si nous voulons fonctionner sur les données groupées: (voici les statistiques des utilisateurs)
Select.put ("count", nouveau BasicDBObject ("$ sum", 1));5. Group de Splice $
DBObject Group = new BasicDBObject ("$ Group", SELECT);Jusqu'à présent. Épliptons la déclaration de MongoDB ici
Commençons l'opération de requête:
import com.mongodb.aggregationOutput; import org.springframework.data.mongodb.core.mongotemplate; agrégationOutput output = mongotemplate.getCollection ("voici le nom de la table de données de mongodb") .aggregate (match, groupe);Lisez le résultat de la requête:
ITable <dbObject> map = output.results (); // transip mapfor (dbObject dbObject: map) {// La carte lue ici est {"_id": {"userId": 1, "status" 0}} ... map <string, objet> resultMap = (map <string, objet>) dbObject.get ("_ id"); //Transfer.0 Integer userId = Integer.ParseInt (commutil.toString (AUSGMAP.get ("userId")). Remplace (". 0", "")); // Ici, nous pouvons fonctionner sur nos données; Integer Count = Integer.ParseInt (Commutitil.ToString (dbObject.get ("Count"))); }2. DbObject
Sans plus tarder, si vous pensez que la première méthode est particulièrement à long terme, je vous apporterai une requête d'agrégation plus concise avec un code plus concis:
Téléchargez simplement le code.
1. Faites attention au package importé:
import com.mongodb.dbObject; import com.mongodb.util.json;
2. $ MACTH:
(Date de début Beginday-Query; fin de fin de requête)
DbObject Match = (dbObject) JSON.Parse ("{$ correspond: {'status': '1', 'Time': {$ gte: '" + Beginday + "', $ lte: '" + finday + "'}}}");3. Group $:
(Grouillé par UserId, compter le nombre d'utilisateurs, accumuler la valeur du champ Amout et prendre la valeur maximale du champ Amout)
DbObject Group = (dbObject) JSON.Parse ("{$ groupe: {_ id: '$ userId', count: {$ sum: 1}, total: {$ sum: '$ montant'}, maxsigle: {$ max: '$ montant'}}}");Une fois les conditions épissées, commencez à interroger:
List <dbObject> list = new ArrayList <dbObject> (); list.add (match); list.add (groupe); AggregationOutput output = Mongotemplate.getCollection ("Nom de la table"). AGLGEGATE (LIST);Il n'est pas nécessaire de parler du résultat de la traversée. Ce qui précède a été décrit en détail
La deuxième méthode est-elle beaucoup plus simple que l'autre? Mais cela teste sa familiarité avec les déclarations MongoDB.
【Étendu】
Ensuite, la méthode ci-dessus se développe
// Le statut est 0 ou 1; type pas 11; time DBObject match = (DBObject) JSON.parse("{$match:{'status':{$in:['0','1']}, type:{$ne:11},'time':{$gte:'+beginDay+"',$lte:'+endDay+"'}}}");//Group by user ID, count the number of queries, and take the time of La dernière fois dbObject Group = (dbObject) JSON.Parse ("{$ groupe: {_ id: '$ userId', count: {$ sum: 1}, dernier: {$ max: '$ time'}}}"); // Dans les résultats comptés à l'étape précédente, les données avec des temps de filtrage supérieurs à 100 fois dboBject GroupMatch = (dbobob JSON.Parse ("{$ correspond: {count: {$ gte: 100}}}"); // $ project ---- quels champs doivent être affichés dans le résultat de la requête, et l'affichage est défini sur 1. Le champ _ID (champ) ne doit pas être affiché comme suit, vous devez donc le spécifier comme suit: // db. Nom de la collection.Aggregate ([{$ Project: {_id: 0, Count: 1, LastSuctime: 1}}]) DbObject Project = (dbObject) JSON.Parse ("{$ Project: {_ id: 1, Count: 1, LastSucctime: 1}}"); dbObject Sort = (dbobject)) JSON.Parse ("{$ Sort: {'Count': - 1}}}"); // Tri List <DBObject> list = new ArrayList <DBObject> (); list.add (match); list.add (groupe); list.add (groupematch); nom ") .Aggregate (list); // requête les résultats3. BasicDBObject + instruction Script
BasicDBObject GroupIndex = new BasicDBObject (); BasicDBObject DistinctQuery = new BasicDBObject (); DistinctQuery.put ("UserId", new BasicDBObject ("$ in", userrids)); // userrids Array BasicDBObject initindex = new BasicDbObject (); initindex.put ("Count", 0); // affecter la valeur initiale pour le docy La base de données.prev représente le résultat de la requête // prev.Count le nombre ici est le nombre de l'étape précédente initIndex) String réteint = "function (doc, prev) {if (doc.status == 0) {prev.Count + = 1;};}"; list <map <string, objet>> basicdBlist = (list <map <string, objet >>) mongoTemplate. GetCollection ("Collection"). Group (GroupIndex, distinct, initindex, réduction, null);Enfin, vous pouvez obtenir le résultat en faisant du bouclage via la liste. [PS: Il y a une restriction sur cette méthode d'agrégation de groupe ---> Il y aura une erreur si elle dépasse 20 000 données]
Ce qui précède est ce que j'utilise le traitement de l'agrégation MongoDB dans le traitement commercial ordinaire. S'il y a une meilleure méthode ou quelque chose qui doit être amélioré, veuillez me laisser un message ~