我有以下文档(...意味着更多的属性和 getters 和 setters)
@Document
public class Equipment
{
...
private String name;
private String internalManufacturer;
private String externalManufacturer;
...
}
服务中的此方法,其中传递字段名称(代码)并设置排序。
private void setSorting(String code)
{
...
List<AggregationOperation> pagedAndSortedQuery= new ArrayList<>(baseQuery);
SortOperation sortOperation = sort(Sort.Direction.ASC, code);
if (EquipmentsSortingField.MANUFACTURER.getCode().equals(code))
{
sortOperation = sort(sortingDirection, "internalManufacturer", "externalManufacturer");
pagedAndSortedQuery.add(sortOperation);
}
}
我想对 internalManufacturer 和 externalManufacturer 进行排序,就好像它们是一个字段一样,因为如果我在服务中这样做,首先我得到的结果是对 internalManufacturers 进行排序,然后对它们进行排序 externalManufacturers。重要的是,如果 externalManufacturer 为空,则 internalManufacturer 不是,反之亦然。
例如,我在数据库中有这个:
Equipment (externalManufacturer: John, internalManufacturer: null)
Equipment (externalManufacturer: null, internalManufacturer: Carlos)
Equipment (externalManufacturer: Ash, internalManufacturer: null)
Equipment (externalManufacturer: null, internalManufacturer: Victor)
使用我的代码,我将设备排序如下:
Equipment (externalManufacturer: null, internalManufacturer: Carlos)
Equipment (externalManufacturer: null, internalManufacturer: Victor)
Equipment (externalManufacturer: Ash, internalManufacturer: null)
Equipment (externalManufacturer: John, internalManufacturer: null)
我喜欢这样得到它们:
Equipment (externalManufacturer: Ash, internalManufacturer: null)
Equipment (externalManufacturer: null, internalManufacturer: Carlos)
Equipment (externalManufacturer: John, internalManufacturer: null)
Equipment (externalManufacturer: null, internalManufacturer: Victor)
总而言之,将两个字段都当作一个字段进行排序。
我该怎么做?提前致谢。
您应该使用
$addFields
生成一个新字段,这是内部和外部制造商的串联版本。然后使用这个新字段进行排序。沿着这些线的东西:
private void setSorting(String code)
{
...
List<AggregationOperation> pagedAndSortedQuery= new ArrayList<>(baseQuery);
SortOperation sortOperation = sort(Sort.Direction.ASC, code);
if (EquipmentsSortingField.MANUFACTURER.getCode().equals(code))
{
AddFieldsOperation addFieldsOperation =
Aggregation.addFields().addFieldWithValue(
"manufacturerString",
StringOperators.Concat.concatValueOf(ConditionalOperators.ifNull("internalManufacturer").then("")).concatValueOf(ConditionalOperators.ifNull("externalManufacturer").then(""))
).build();
sortOperation = sort(sortingDirection, "manufacturerString");
pagedAnsSortedQuery.add(addFieldsOperation);
pagedAndSortedQuery.add(sortOperation);
}
}
注意,我已经使用了新字段进行排序,并且还在管道中添加了
addField
阶段。请测试一下,我希望你明白了。