内部字段中的Spring Data MongoDB @Indexed(unique = true)

时间:2018-04-19 21:34:34

标签: spring mongodb spring-data spring-data-mongodb

例如,有两个类:

@Document
public class WordSet {
   @Id
   private ObjectId id;

   private Language language;
   private ObjectId languageId;
} 

@Document
public class Language {
   @Id
   private ObjectId id;

   @Index(unique = true)
   private String languageName;
}

语言存储在单独的集合中,WordSet存储在另一个集合中。但WordSet仅与languageId一起存储(当我保存WordSet时,语言始终为null)。需要WordSet中的语言字段,但使用聚合

进行检索
public Flux<WordSet> getAll() {
        AggregationOperation[] joinLanguages = new AggregationOperation[] {
                lookup(mongoTemplate.getCollectionName(Language.class), "languageId", "_id", "language"),
                unwind("language")
        };

        Aggregation agg = newAggregation(joinLanguages);

        return mongoTemplate.aggregate(agg, WordSet.class, WordSet.class);
    }

因此,mongodb中的WordSet仅包含languageId,并且使用聚合填充语言字段(从语言集合中加入)。

但是如果我想在收集中添加多个WordSet,我就会出错 com.mongodb.MongoWriteException:E11000重复键错误集合:langdope.wordSet index:language.language_name_index dup key:{:null}

我该如何处理?我需要languageName是唯一的,但我也想保存包含语言的对象而没有这个问题。我不能只将语言标记为@Transient(聚合不起作用)。

0 个答案:

没有答案