1. BasicDbobject
Весь запрос агрегации состоит в том, чтобы подсчитать количество пользователей в различных состояниях пользователей как сценарии:
1. Критерии фильтра:
дата - дата запроса:
Basicdbobject Query = new BasicDBobject (); Query.put ("Time", New BasicDbobject ("$ GTE", Date + "00:00:00"). Append ("$ lte", Date + "23:59:59"));Если есть несколько условий: добавить Query.put ("status", 0);
Если есть или фильтр:
BasicDblist Values = new BasicDblist (); values.add (new basicdbobject ("status", new basicdbobject ("$ fastist", false))); values.add (new basicdbobject ("status", 0)); query.put ("$ или", values);где New BasicDbobject («$ существует», false)) означает, что «статус» не существует (документ MongoDB не может быть равен полю объекта)
2. Спилосинг матч
Dbobject match = new basicdbobject ("$ match", Query);Поместите предыдущий запрос в фильтр Macth
3. Условия сращивания и группировки
Этот шаг эквивалентен группе SQL
BasicDBobject GroupBy = new BasicDBobject (); // Группирование условий GroupBy.put ("userId", "$ userId"); // Группа в соответствии с идентификатором пользователяКак и шаг фильтрации на первом шаге, если есть несколько групп, вы можете напрямую добавить их к следующему: Groupby.put («Статус», «Статус $»);
4. Постгрупп запрос
Сначала сплайсируйте группировки:
Dbobject select = new BasicDbobject ("_ ID", GroupBy);Если мы хотим работать на сгруппированных данных: (вот статистика пользователей)
Select.put ("count", new basicdbobject ("$ sum", 1));5. Splice $ Group
Dbobject Group = new BasicDbobject ("$ Group", SELECT);До сих пор. Давайте разыграем заявление MongoDB
Давайте начнем операцию запроса:
Import com.mongodb.aggregationOutput; import org.springframework.data.mongodb.core.mongotemplate; aggregationOutput output = mongotemplate.getCollection («Вот имя таблицы данных MongoDB») .aggregate (Match, Group);
Прочитайте результат запроса:
Iteerable <dbobject> map = output.results (); // transip mapfor (dbobject dbobject: map) {// Читая карта здесь {"_id": {"userId": 1, "Состояние" 0}} ... Map <String, Object> ResultMap = (map <string, object>) dbobject.get ("_ ID"); //Transfer.0 integer userid = integer.parseint (commutil.tostring (ausgmap.get ("userid")). Replication (". 0", "")); // Здесь мы можем работать на наших данных; Integer count = integer.parseint (commutil.tostring (dbobject.get ("count"))); }2. dbobject
Без лишних слов, если вы считаете, что первый метод является особенно долгосрочным, то я представлю вам более краткий запрос агрегации с более кратким кодом:
Просто загрузите код.
1. Обратите внимание на импортный пакет:
Импорт com.mongodb.dbobject; импорт com.mongodb.util.json;
2. $ macth:
(Дата начала Query-Query; дата окончания в конце дня-дата окончания)
Dbobject match = (dbobject) json.parse ("{$ match: {'status': '1', 'time': {$ gte: '"+beginday+"', $ lte: '"+condday+"'}}}}");3. $ Group:
(Сгруппировано по пользователю, подсчитывайте количество пользователей, накапливает значение поля AMOUT и возьмите максимальное значение поля AMOUT)
Dbobject group = (dbobject) json.parse ("{$ group: {_ id: '$ userid', count: {$ sum: 1}, общая: {$ sum: '$ summ'}, maxsigle: {$ max: '$ summ'}}}}");После того, как условия запланированы, начинайте запросить:
List <dbobject> list = new ArrayList <dbobject> (); list.add (match); List.Add (группа); AggregationOutput output = mongotemplate.getCollection ("имя таблицы"). Aggregate (List);Нет необходимости говорить о результате обхода. Вышеупомянутое подробно описано
Второй метод намного проще другого? Но это проверяет свое знакомство с заявлениями MongoDB.
【Расширенный】
Тогда приведенный выше метод расширяется
// статус равен 0 или 1; тип не 11; время dbobject match = (dbobject) json.parse ("{$ match: {'status': {$ in: ['0', '1']}, тип: {$ ne: 11}, 'time': {$ gte: '+beginday+"', $ lte: '+wime at}}} "); В последний раз dbobject Group = (dbobject) json.parse ("{$ Group: {_ ID: '$ userId', count: {$ sum: 1}, в прошлый раз: {$ max: '$ time'}}}"); // в результатах, подсчитанных в предыдущем шаге, данные с фильтрованием больше, чем в 100 раз dbobject groupmatch = d Json.parse ("{$ match: {count: {$ gte: 100}}}"); // $ project ---- Какие поля должны отображаться в результате запроса, и дисплей установлен в 1. Поле _id (поле) не должно отображаться следующим образом, поэтому вам необходимо указать следующее: // db. Имя коллекции.aggregate ([{$ project: {_id: 0, count: 1, lastsucctime: 1}}]) dbobject project = (dbobject) json.parse ("{$ project: {_ id: 1, count: 1, lastsucctime: 1}}"); Json.parse ("{$ sort: {'count':-1}}"); // Сортировка сортировки <dbobject> list = new Arraylist <dbobject> (); list.add (match); list.add (группа); list.add (GroupMatch); list.add (project); sort. sort.tailtectuentauttureturetecturetecturetecturetecturetautemation aleltecturetautematuretecturetaT Имя ") .agegrate (List); // Результаты запроса3. BasicDbobject+оператор скрипта
BasicDbobject GroupIndex = new BasicDboBject (); BasicDboBject disfulQuery = new BasicDBobject (); DissultQuery.put («userId», new BasicDBobject ("$ in", userId из базы данных. PREV представляет результат запроса // prev.count. Здесь является счет предыдущего шага initIndex) string cread = "function (doc, prev) {if (doc.status == 0) {prev.count+= 1;};}"; list <map, объект >> basicdblist = (sirect <map <string, object >> mongotteTatrate. getCollection ("collection"). Group (GroupIndex, DisfulQuery, initIndex, уменьшение, нулевой);Наконец, вы можете получить результат, пройдя через список. [PS: Существует ограничение на этот метод агрегации группы ---> будет ошибка, если она превысит 20 000 данных]
Приведенное выше я использую обработку агрегации MongoDB в обычной бизнес -обработке. Если есть лучший метод или что -то, что требует улучшения, оставьте мне сообщение ~