将两个字段合二为一并按新的组合字段排序

问题描述 投票:0回答:1

我有以下文档(...意味着更多的属性和 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)

总而言之,将两个字段都当作一个字段进行排序。

我该怎么做?提前致谢。

mongodb spring-data spring-data-mongodb
1个回答
0
投票

您应该使用

$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
阶段。请测试一下,我希望你明白了。

© www.soinside.com 2019 - 2024. All rights reserved.