Java 使用Spring MongoTemplate为数组中的MongoDB子文档自动生成ID

Java 使用Spring MongoTemplate为数组中的MongoDB子文档自动生成ID,java,mongodb,spring-boot,spring-data,spring-data-mongodb,Java,Mongodb,Spring Boot,Spring Data,Spring Data Mongodb,我的post的MongoDB文档结构如下 { "_id" : ObjectId("5e487ce64787a51f073d0915"), "active" : true, "datePosted" : ISODate("2020-02-15T23:21:10.329Z"), "likes" : 400, "commentList" : [ { "datePosted" : ISODate("2020-02-15T23:21:10.329Z"), "com

我的
post
的MongoDB文档结构如下

{
"_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;

  ....

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

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

  ....

}
PostEntity.java

public class CommentEntity{

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

  ....

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

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

  ....

}
Spring数据将类映射到MongoDB文档中。在映射过程中,只能自动生成
\u id

MongoDB要求所有文档都有一个“\u id”字段。如果不提供,驱动程序将使用生成的值分配一个对象ID。用
@Id(org.springframework.data.annotation.Id)
注释的字段将映射到“\u Id”字段

没有注释但名为
id
的字段将映射到
\u id
字段

解决方法:
id
字段和约定的实例新建
ObjectId
,将
id
转换为
\u id

public class CommentEntity {

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

    ....

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

}

尝试将
@Id
设置为
CommentEntity.Id
,它将执行以下操作trick@Valijon不,它没有添加id。它对你有用吗?