例如,有两个类:
@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(聚合不起作用)。