Вот групповая операция, которую я хочу создать в зависимости от объекта номенклатуры.
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
значение результата.