2017-01-16 5 views
1

Команда,Весовые данные Совокупный запрос

Я новичок в данных Spring для mongodb. Я пытаюсь узнать код данных Spring для запроса агрегации. но в большинстве уроков показаны только простые примеры. Могли бы вы , пожалуйста, помогите мне построить весенний код данных для данного сложного агрегатного примера.

SCHEMA: 
{ 
    "s" : "CB", 
    "c" : "REQ_RCV", 
    "e" : "cta_sms_click", 
    "st" : "i", 
    "b" : "UB", 
    "a" : "account-1", 
    "u" : "b1_h1_d1_m1_user_2", 
    "c#" : "b1_h1_d1_m1_cr-2", 
    "@" : ISODate("2016-10-01T06:03:00.000Z"), 
    "@h" : "16100106", 
    "@d" : "161001", 
    "@m" : "1610" 
} 


QUERY: 
db.COLLECTION_NAME.aggregate([      
     {$match:{"st":"i","@":{$gte : new ISODate("2015-10-01T06:00:00Z"), $lte : new ISODate("2017-10-02T10:00:00Z")}, "c":"REQ_RCV"}}, 
     {$group:{_id:{"b":"$b", "HOURLY":"[email protected]"}, count:{$sum:1}}}, 
     {$project : {_id:0, "BUCKET":"$_id.b", "TIME":"$_id.HOURLY", count:1}}, 
     {$sort:{"BUCKET":1, "TIME":1}}      
    ]); 

Сложность:

  1. $ матча Muliple из условий
  2. $ Проекта имеет доступ к внутренней области группы под _id
  3. Результат не может быть отображен в класс, так как она меняется основанный на изменении полей проекта. В конечном итоге я бы хотел бы сопоставить его с java.util.HashMap, чтобы я мог поместить любые поля внутри $ project. Это возможно?

Первоначальный ответ от Veeram для справки:


Aggregation agg = newAggregation(match(where("st").is("i").and("@").gte(start_date).lte(end_date).and("c").is("REQ_RCV")), 
        group(fields("b").and("HOURLY", "[email protected]")).count().as("count"), 
        project(fields("count").and("BUCKET","$_id.b").and("TIME", "$_id.HOURLY")), 
        sort(ASC, "BUCKET", "TIME")); 
+0

@chridam Не могли бы вы помочь мне здесь? –

ответ

1

Вы можете попробовать что-то, как показано ниже. Замените ваши значения даты и имя коллекции.

import static org.springframework.data.domain.Sort.Direction.ASC; 
import static org.springframework.data.mongodb.core.aggregation.Aggregation.*; 
import static org.springframework.data.mongodb.core.query.Criteria.where; 

Aggregation agg = newAggregation(match(where("st").is("i").and("@").gte(new Date()).lte(new Date()).and("c").is("REQ_RCV")), 
      group(fields("b").and("HOURLY", "[email protected]")).count().as("count"), 
      sort(ASC, Aggregation.previousOperation())); 

List<BasicDBObject> dbObjects = mongoOperations.aggregate(agg, "collection_name", BasicDBObject.class).getMappedResults(); 
+0

спасибо !! Veeram ventrathu !!! –

+0

Один запрос. Объявление имени в 'project' как« BUCKET »и« TIME »обязательно для вызова в' sort'? И нельзя ли писать 'sort (ASC," $ _id.b "," $ _id.HOURLY ")'? –

+0

Обновлен ответ. Извините, я должен был это заметить. Вы можете использовать 'previousOperation()' для сортировки, которая содержит ссылку на ранее группу '_id' – Veeram

1

Так что, вероятно, более способ пружинными данных делать это, но что им делать это электромонтаж MongoTemplate и с помощью этого к запросу Aggreagation. Мой пример нам гораздо проще, чем то, что вы хотите сделать, но, возможно, это может помочь:

@Service 
    public class AClass implements CategoryStructureService { 

      @Autowired 
      private MongoTemplate mongoTemplate ; 

    ...... 
    private int method(CategoryStructureKey csKey) { 

      Aggregation agg = Aggregation.newAggregation(Aggregation.match(Criteria 
        .where("_id").is(csKey)), Aggregation.unwind("fields"), 
        Aggregation.project("fields").andExclude("_id"), Aggregation 
          .sort(Direction.DESC, "fields.index"), Aggregation 
          .limit(1)); 

AggregationResults<MultiValuedFieldContainer> field = mongoTemplate 
       .aggregate(agg, CategoryStructure.class, 
         MultiValuedFieldContainer.class); 
     .... 

     } 

Я сделал это со старым проектом весна-загрузки, имея это как зависимость

<dependency> 
      <groupId>org.springframework.data</groupId> 
      <artifactId>spring-data-mongodb</artifactId> 
      <version>1.4.2.RELEASE</version> 
     </dependency> 

Так должно Работа.

Вы можете найти лучший пример MongoTemplate здесь https://www.mkyong.com/mongodb/spring-data-mongodb-aggregation-grouping-example/

и некоторых других примеры Agrregation https://github.com/spring-projects/spring-data-mongodb/blob/master/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/aggregation/AggregationTests.java

Надеется, что это помогает