具有约束

时间:2016-08-01 19:02:43

标签: java spring mongodb spring-data-mongodb

我想创建一个非常简单的带注释的Java POJO并将其保存到mongodb中。基本上,它是:

@Component("vehicle")
@Scope("prototype")
@Document(collection = "vehicle")
@CompoundIndexes({
        @CompoundIndex(name = "plateNumber_idx", def = "{ 'plateNumber' : 1 }", unique = true),
        @CompoundIndex(name = "vin_idx", def = "{ 'vin' : 1 }", unique = true),
        @CompoundIndex(name = "motorNumber_idx", def = "{ 'motorNumber' : 1 }", unique = true)
})
public class Vehicle {

    private String plateNumber;
    private String vin;
    private String motorNumber;

   ... getters, setters, equal, hash etc. ....
}

它工作正常,但在我的情况下,我需要为motorNumber字段添加部分索引。原因是:没有必要填写此字段,因此该字段可以为null。但另一方面,不允许是两个或更多类似的motorNumber - 除非那些是null。我可以手动将部分索引添加到车辆集合中,但是通过注释来实现它将是更优雅的方式。例如,这是我的部分索引:

{"motorNumber" : {"$exists" : true}}

我的问题是:如何将此选项添加到@CompoundIndex?或者还有其他选择吗?

1 个答案:

答案 0 :(得分:2)

我在尝试做同样的事情时发现了你的问题。

据我所知,spring-boot 1.5.x或2.0.x的spring-data-mongodb均不通过常规注释支持部分索引。

但是,spring-data-mongodb确实允许您以编程方式创建它们:

Index myIndex = new Index()
    .background()
    .unique()
    .named("my_index_name")
    .on("indexed_field_1", Sort.Direction.ASC)
    .on("indexed_field_2", Sort.Direction.DESC)
    .partial(PartialIndexFilter.of(
        Criteria.where("criteria_field_1")
        .is("BAR")));

DefaultIndexOperations indexOperations = new DefaultIndexOperations(mongoTemplate, "my_collection");

indexOperations.ensureIndex(myIndex);