Как создать комбинированное свойство _id группы $ в агрегации mongo с использованием данных Spring?

Я нашел эту команду mongo в документах mongodb:

db.sales.aggregate( 
   [ 
      { 
        $group : { 
           _id : { month: { $month: "$date" }, day: { $dayOfMonth: "$date" }, year: { $year: "$date" } }, 
           totalPrice: { $sum: { $multiply: [ "$price", "$quantity" ] } }, 
           averageQuantity: { $avg: "$quantity" }, 
           count: { $sum: 1 } 
        } 
      } 
   ] 
) 

при использовании Spring Data Aggregation легко привязать одно свойство Document к _id в $ group с помощью вызова Aggregation.group (Feild ...)

но для вышеупомянутой ситуации свойство _id объединено, и мне не удалось создать его на Java. У вас есть какое-нибудь решение ??? Я имею в виду, как выразить js выше на Java ??

огромное спасибо...

@update ..... _id группы $ использует функции mongo, такие как $ month $ dayOfMonth ... Как я могу сделать это в данных Spring ??


person sunnyfinger    schedule 06.11.2014    source источник
comment
_id группы $ использует функции mongo, такие как $ month $ dayOfMonth ... Как я могу сделать это в данных Spring ??   -  person sunnyfinger    schedule 06.11.2014
comment
Чувствую к тебе здесь. Сначала я видел это как дубликат, но это определенно не так. Spring-Mongo, похоже, не имеет необходимых операций, чтобы сделать эту часть _id для группировки. Единственное, что я четко вижу, - это отдельная $project операция, которая не является оптимальной, и нет текущей объединение оптимизатора, чтобы помочь. Поменять теги соответствующим образом, чтобы, надеюсь, кто-то вроде Оливера смог пролить свет на это.   -  person Neil Lunn    schedule 06.11.2014


Ответы (1)


Вы можете сначала попробовать спроецировать поля, используя SpEL andExpression в операции проекции, а затем сгруппируйте по новым полям в операции группировки:

Aggregation agg = newAggregation(
    project()       
        .andExpression("year(date)").as("year")
        .andExpression("month(date)").as("month")
        .andExpression("dayOfMonth(date)").as("day")
        .andExpression("price * quantity").as("grossPrice"),
    group(fields().and("year").and("month").and("day")) 
        .sum("grossPrice").as("totalPrice")
        .avg("quantity").as("averageQuantity")  
        .count().as("count")
);
person chridam    schedule 04.11.2015