Как сделать Spring Data MongoDB GroupOperation для одного поля, но с идентификатором объекта в качестве результата? - PullRequest
0 голосов
/ 03 августа 2020

Вот групповая операция, которую я хочу создать в зависимости от объекта номенклатуры.

private static GroupOperation createStatsGroupOperationFromNomenclature(Nomenclature nomenclature) {
    Fields groupFields = Fields.fields("departmentCode");
    nomenclature.getDepartmentCode().ifPresent(code -> groupFields.and("subDepartmentCode"));
    nomenclature.getSubDepartmentCode().ifPresent(code -> groupFields.and("categoryCode"));
    nomenclature.getCategoryCode().ifPresent(code -> groupFields.and("subCategoryCode"));
    return group(groupFields)
        .count().as("nbProducts")
        .sum("$proposedMatchesAmount").as("nbProposedMatches")
        .sum("$reviewedMatchesAmount").as("nbReviewedMatches");
}

С предыдущей функцией, если я предоставлю departmentCode и subDepartmentCode внутри параметра номенклатуры, здесь выполняется запрос mon go:

{
  _id: {
    "departmentCode": "$departmentCode",
    "subDepartmentCode": "$subDepartmentCode"
  },
  "nbProduct": {
    $sum: 1
  },
  "proposedMatchesAmount": {
    $sum: "$proposedMatchesAmount"
  },
  "reviewedMatchesAmount": {
    $sum: "$reviewedMatchesAmount"
  }
}

Результат этого запроса анализируется в следующем объекте:

@Builder
@Value
public class ProductsStatsDocument {
  @Id
  Nomenclature nomenclature;
  Integer nbProducts;
  Integer nbProposedMatches;
  Integer nbReviewedMatches;
}

Проблемы добавляются, когда я предоставляю только departmentCode внутри параметра номенклатуры. Тогда операция построенной группы имеет следующий эквивалент языка запросов mon go:

{
  _id: "$departmentCode",
  "nbProduct": {
    $sum: 1
  },
  "proposedMatchesAmount": {
    $sum: "$proposedMatchesAmount"
  },
  "reviewedMatchesAmount": {
    $sum: "$reviewedMatchesAmount"
  }
}

И результат этого запроса не может быть проанализирован с предыдущим ProductsStatsDocument, потому что результат _id field id теперь это строка, а не объект номенклатуры.

Можно ли заставить метод group использовать объект в качестве поля результата _id даже с одним полем? Или есть другой способ построить такую ​​групповую операцию mon go?

=========================== ======================================

Нашел «почему» Эта проблема. Вот фрагмент кода из данных Spring, который преобразует GroupOperation в объект bson:

    } else if (this.idFields.exposesSingleNonSyntheticFieldOnly()) {
      FieldReference reference = context.getReference((Field)this.idFields.iterator().next());
      operationObject.put("_id", reference.toString());
    } else {

А вот метод exposesSingleNonSyntheticFieldOnly:

  boolean exposesSingleNonSyntheticFieldOnly() {
    return this.originalFields.size() == 1;
  }

Как видите, как только есть только одно поле для группировки, оно используется как _id значение результата.

1 Ответ

0 голосов
/ 04 августа 2020
• 1000 toDocument кажется устаревшим.
...