Группировка агрегации с использованием данных весны mongodb - PullRequest
0 голосов
/ 18 мая 2018

Я пытался написать запрос групповой агрегации, используя значение года из объекта даты в качестве ключа, но по какой-то причине я получаю это исключение.

org.springframework.data.mapping.PropertyReferenceException: No property year(invoiceDate)

Вот монго-запрос, который я пытаюсь повторить:

db.collection.aggregate([
   {
     $match:
     {
       "status": "Active"
     }
   },
   {
     $group:
     {
      "_id":{$year:"$invoiceDate"}
     }
  },
  {
    $sort:
    {
      "_id" : -1
    }
  }
])

И это моя реализация Java:

Aggregation aggregation = Aggregation.newAggregation(
    match(new Criteria().andOperator(criteria())),
    Aggregation.group("year(invoiceDate)")
).withOptions(newAggregationOptions().allowDiskUse(true).build());

Я тоже не сделалНе могу найти способ, как применить сортировку к результатам из группировки.

1 Ответ

0 голосов
/ 18 мая 2018

Вы в основном ищете extractYear(), который сопоставляется с оператором $year с MongoDB:

Aggregation aggregation = Aggregation.newAggregation(
    Aggregation.match(new Criteria().andOperator(criteria())),
    Aggregation.project().and("invoiceDate").extractYear().as("_id"),
    Aggregation.group("_id"),
    Aggregation.sort(Sort.Direction.DESC, "_id)
)

Это обычно должно входить в $project, чтобы осчастливить помощников.

Если вы действительно хотите, чтобы выражение находилось в $group, тогда вы можете добавить выражение пользовательской операции:

Aggregation aggregation = Aggregation.newAggregation(
  Aggregation.match(new Criteria().andOperator(criteria())),
  new AggregationOperation() {
    @Override
    public Document toDocument(AggregationOperationContext aggregationOperationContext) {
      return new Document("$group",
        new Document("_id", new Document("$year","$invoiceDate") )
      );
    }
  },
  Aggregation.sort(Sort.Direction.DESC, "_id)
)
...