1. BasicDBobject
Toda la consulta de agregación es contar el número de usuarios en varios estados de usuarios como escenarios:
1. Criterios de filtro:
La fecha es la fecha de consulta:
BasicDBobject Query = new BasicDBObject (); QUERY.PUT ("TIME", New BasicDBObject ("$ GTE", fecha + "00:00:00") .Append ("$ lte", fecha + "23:59:59");Si hay múltiples condiciones: agregue Query.put ("Estado", 0);
Si hay o filtrar:
BasicDBlist valores = new BasicDBlist (); valores.Add (new BasicDBObject ("estado", new BasicDBObject ("$ existe", falso))); valores.Add (new BasicDBObject ("estado", 0)); query.put ("$ o", valores);donde el nuevo BasicDBobject ("$ existe", falso)) significa que el "estado" no existe (el documento MongoDB no puede ser igual a un campo de entidad)
2. Partido de empalme
DBobject Match = new BasicDBObject ("$ Match", consulta);Coloque la consulta anterior en el filtro MACTH
3. Condiciones de empalme y agrupación
Este paso es equivalente al grupo SQL por
BasicDBObject GroupBy = new BasicDBObject (); // Condiciones de agrupación GroupBy.put ("UserId", "$ userId"); // Group según ID de usuarioAl igual que el paso de filtrado en el primer paso, si hay varios grupos, puede agregarlos directamente a lo siguiente: GroupBy.put ("Estado", "$ Status");
4. Consulta posterior al grupo
Primero empalme las agrupaciones:
Dbobject select = new BasicDBObject ("_ id", GroupBy);Si queremos operar en los datos agrupados: (aquí están las estadísticas de los usuarios)
Select.put ("Count", new BasicDBObject ("$ sum", 1));5. Splice $ Group
DBObject Group = new BasicDBObject ("$ Group", seleccionar);Hasta ahora. Vamos a empalmar la declaración de MongoDB termina aquí
Comencemos la operación de consulta:
import com.mongoDB.AggregationOutput; import org.springframework.data.mongodb.core.MongoTemplate; AggregationOutput output = MongoTemplate.getCollection ("Aquí está el nombre de la tabla de datos de MongoDB") .Gregate (coincidencia, grupo, grupo);Lea el resultado de la consulta:
ITerable <DBObject> map = output.Results (); // transip mapfor (dbObject dBObject: map) {// El mapa leído aquí es {"_id": {"userId": 1, "status" 0}} ... map <string, object> dutMap = (map <string, object>) dbobject.get ("_ id"); //Transfer.0 Integer userId = Integer.ParseInt (CommUtil.ToString (ausgmap.get ("userId")). Reemplazar (". 0", "")); // Aquí podemos operar en nuestros datos; Integer count = Integer.ParseInt (CommUtil.ToString (dBObject.get ("Count"))); }2. DBObject
Sin más preámbulos, si cree que el primer método es particularmente a largo plazo, entonces le traeré una consulta de agregación más concisa con un código más conciso:
Simplemente suba el código.
1. Presta atención al paquete importado:
import com.mongodb.dbobject; import com.mongodb.util.json;
2. $ Macth:
(Fecha de inicio de BegindAy-Query; Fecha de finalización de Finday-Query)
DbObject match = (dbObject) json.parse ("{$ match: {'status': '1', 'time': {$ gte: '"+beginday+"', $ lte: '"+endday+"'}}}");3. $ Group:
(Agrupado por INSEREDID, cuente el número de usuarios, acumule el valor del campo Amout y tome el valor máximo del campo Amout)
Dbobject group = (dbObject) json.parse ("{$ group: {_ id: '$ userId', count: {$ sum: 1}, total: {$ sum: '$ montaDespués de que las condiciones se empalmen, comience a consultar:
List <dbObject> list = new ArrayList <DBObject> (); list.Add (Match); list.Add (grupo); agregationOutput output = MongoTemplate.getCollection ("Nombre de la tabla"). Aggregate (List);No hay necesidad de hablar sobre el resultado transversal. Lo anterior ha sido descrito en detalle
¿El segundo método es mucho más simple que el otro? Pero prueba la familiaridad de uno con las declaraciones de MongoDB.
【Extendido】
Entonces el método anterior se expande
// El estado es 0 o 1; Tipo no 11; TIME DBObject Match = (dBObject) json.Parse ("{$ match: {'status': {$ in: ['0', '1']}, type: {$ ne: 11}, 'time': {$ gte: '+beginDay+"', $ lte: '+day+"'"}}}); // la última vez que dbobject group = (dbObject) json.parse ("{$ grupo: {_ id: '$ userId', count: {$ sum: 1}, LastTime: {$ max: '$ time'}}}"); // en los resultados contados en el paso anterior, datos con tiempos de filtrado superiores a 100 veces dbobject groupmatch = (dbObject) Json.parse ("{$ Match: {Count: {$ Gte: 100}}}"); // $ Proyecto ---- qué campos debe mostrarse en el resultado de la consulta, y la pantalla se establece en 1. El campo _id (campo) no debe mostrarse de la siguiente manera, por lo que debe especificarlo de la siguiente manera: // db. Nombre de la colección.aggregate ([{$ Project: {_id: 0, Count: 1, LastSuccTime: 1}}]) dBObject Project = (dBObject) Json.Parse ("{$ Project: {_ id: 1, Count: 1, LastCcTime: 1}}}"); dBobject sort = (dbObject) Json.parse ("{$ sort: {'count':-1}}"); // clasificar lista <dbObject> list = new ArrayList <dbObject> (); list.add (match); list.add (grupo); list.add (groupMatch); list.Add (proyect); list.add (sort); agregación en agostoutput = MongoTemplate.getCollection ("Nombre de la tabla") .Gregate (List); // Resultados de la consulta3. BasicDBobject+Script Declare
BasicDBObject GroupIndex = new BasicDBObject (); BasicDBObject DistintQuery = new BasicDBObject (); distintInQuery.put ("userId", new BasicDBObject ("$ in", userIds)); // userIds Array BasicDBEpject initIndex = new BasicDBObject (); initindex.put ("Count", 0); // ///////////ssulter to script//neo básico (new BasicDBOpject (); initindex.put ("Count", 0); // // /////////////count ///////////ssult//script/script//script//scripte representa los datos de la base de datos.prev representa el resultado de la consulta // anterior. COUNT El recuento aquí es el recuento del paso anterior initindex) string reduce = "function (doc, prev) {if (doc.status == 0) {prepre.count+= 1;};}"; List <Map <String, Object >> BasicDblist = (List <Map <String, Object >>) Mongoteplate. getCollection ("colección"). Group (GroupIndex, DistintQuery, InitIndex, Reduce, NULL);Finalmente, puede obtener el resultado al bucle a través de la lista. [PS: Hay una restricción en este método de agregación del grupo ---> Habrá un error si excede los 20,000 datos]
Lo anterior es lo que uso el procesamiento de agregación de MongoDB en el procesamiento de negocios comunes. Si hay un mejor método o algo que necesita mejora, déjame un mensaje ~