Spring 数据 mongo - 唯一的随机生成字段

Spring data mongo - unique random generated field

我正在使用 spring 数据 mongo。我在文档中有一个集合,当我向其中添加一个项目时,我想为其分配一个新的自动生成的唯一标识符,例如(someGeneratedId)

@Document(collection = "questionnaire")
public class Questionnaire {

  @Id
  private String id;

  @Field("answers")
  private List<Answer> answers;
}

public class Answer {
  private String someGeneratedId;
  private String text;
}

我知道我可以使用 UUID.randomUUID()(包装在某种服务中)并设置值,我只是想知道是否有现成的东西可以处理这个问题?来自 here @Id 似乎特定于 mongo 中的 _id 字段:

The @Id annotation tells the mapper which property you want to use for the MongoDB _id property

TIA

不,没有现成的解决方案可以为嵌入式文档的属性生成 ID。

如果你想让它远离你的业务逻辑,你可以实现一个 BeforeConvertCallback 来为你的嵌入对象生成 id。

@Component
class BeforeConvertQuestionnaireCallback implements BeforeConvertCallback<Questionnaire> {

    @Override
    public Questionnaire onBeforeConvert(@NonNull Questionnaire entity, @NonNull String collection) {
        for (var answer : entity.getAnswers()) {
            if (answer.getId() == null) {
                answer.setId(new ObjectId().toString());
            }
        }

        return entity;
    }
}

您也可以以更通用的方式实现它:

创建新注释:@AutogeneratedId。 然后收听所有实体的所有 BeforeConvertCallback 并使用反射遍历属性。如果为空,则每个使用新注释注释的 属性 都会获得一个唯一的 ID。