Автоматически генерировать идентификаторы для поддокументов MongoDB в массиве с помощью Spring MongoTemplate - PullRequest
0 голосов
/ 16 февраля 2020

Моя структура документа MongoDB для post выглядит следующим образом

{
"_id" : ObjectId("5e487ce64787a51f073d0915"),
"active" : true,
"datePosted" : ISODate("2020-02-15T23:21:10.329Z"),
"likes" : 400,
"commentList" : [ 
    {
        "datePosted" : ISODate("2020-02-15T23:21:10.329Z"),
        "comment" : "I read all your posts and always think they don't make any sense",
        "likes" : 368
    }, 
    {
        "datePosted" : ISODate("2020-02-15T23:21:10.329Z"),
        "comment" : "I enjoy all your posts and are great way to kill time",
        "likes" : 3533
    }
}

И существуют соответствующие классы сущностей

CommentEntity. java

public class CommentEntity{

  private String id;
  private LocalDateTime datePosted;
  private String comment;
  private int likes;

  ....

}

PostEntity . java

@Document(collection = "post")
public class PostEntity {

  @Id
  private String id;
  private boolean active;
  private LocalDateTime datePosted;
  private int likes;
  private List<CommentEntity> commentList;

  ....

}

Я использую Spring Data MongoTemplate для вставок. Как настроить MongoTemplate на автоматическое создание _id для комментариев, а также при их вставке в документ post, что-то вроде ниже

{
"_id" : ObjectId("5e487ce64787a51f073d0915"),
"active" : true,
"datePosted" : ISODate("2020-02-15T23:21:10.329Z"),
"likes" : 400,
"commentList" : [ 
    {
        "_id" : ObjectId("5e487ce64787a51f07snd315"),
        "datePosted" : ISODate("2020-02-15T23:21:10.329Z"),
        "comment" : "I read all your posts and always think they don't make any sense",
        "likes" : 368
    }, 
    {
        "_id" : ObjectId("5e48764787a51f07snd5j4hb4k"),
        "datePosted" : ISODate("2020-02-15T23:21:10.329Z"),
        "comment" : "I enjoy all your posts and are great way to kill time",
        "likes" : 3533
    }
}

1 Ответ

0 голосов
/ 16 февраля 2020

Spring Data отображает ваши классы в документы MongoDB. Во время сопоставления только _id может быть сгенерировано автоматически.

MongoDB требует наличия поля '_id' для всех документов. Если вы его не предоставите, драйвер назначит ObjectId с сгенерированным значением . Поле, помеченное @Id (org.springframework.data.annotation.Id), будет сопоставлено с полем _id.

Поле без аннотации, но с именем id будет сопоставлено с полем _id.

https://docs.spring.io/spring-data/mongodb/docs/current/reference/html/#mapping .conventions.id-field

Обходной путь:

Экземпляр новый ObjectId для id поле и соглашение преобразуют id в _id.

public class CommentEntity {

    private String id;
    private LocalDateTime datePosted;
    private String comment;
    private int likes;

    ....

    public CommentEntity() {
        id = new ObjectId().toString();
        ...
    }

}
...