java - MongoDB 嵌入式对象没有 ID(空值)

标签 java spring mongodb spring-data

我有一个关于 MongoDB 和 Spring Data 的问题。 我有这些域类:

@Document
public class Deal  {
    @Id
    private ObjectId _id;
    private Location location;
    private User user;
    private String description;
    private String title;
    private String price;
    private boolean approved;
    private Date expirationDate;
    private Date publishedDate;
}

@Document
public class Location {
    @Id
    private ObjectId _id;
    private Double latitude;
    private Double longitude;
    private String country;
    private String street;
    private String zip;
}

@Document
public class User {
    @Id
    private ObjectId _id;
    private String email;
    private String password;
    private String profile_image_url;
    private Collection<Deal> deals = new ArrayList<Deal>();
}

通过这些域,我可以成功地进行 CRUD。只有一个问题。保存带有交易的用户时,交易和位置在将它们保存到 MongoDB 时将 _id 设置为 null。 为什么 MongoDB 不能为嵌入式对象生成唯一 ID?

用一笔交易保存用户后的结果:

{ "_id" : ObjectId( "4fed0591d17011868cf9c982" ),
  "_class" : "User",
  "email" : "milo@gmail.com",
  "password" : "mimi",
  "deals" : [ 
    { "_id" : null,
      "location" : { "_id" : null,
        "latitude" : 2.22,
        "longitude" : 3.23445,
        "country" : "Denmark",
        "street" : "Denmark road 77",
        "zip" : "2933" },
      "description" : "The new Nexus 7 Tablet. A 7 inch tablet from Google.",
      "title" : "Nexus 7",
      "price" : "1300",
      "approved" : false,
      "expirationDate" : Date( 1343512800000 ),
      "publishedDate" : Date( 1340933521374 ) } ] }

从结果中可以看出,交易和位置 ID 设置为 NULL。

最佳答案

MongoDB CRUD 操作(insertupdatefindremove)都对顶级文档进行操作排他地——当然您可以按嵌入文档中的字段进行过滤。嵌入文档总是在父文档中返回。

_id 字段是父文档的必填字段,通常不需要或不存在于嵌入文档中。如果你需要一个唯一的标识符,你当然可以创建它们,并且你可以使用 _id 字段来存储它们,如果这对你的代码或你的心智模型来说很方便的话;更典型的是,它们以它们所代表的内容命名(例如“用户名”、“其他系统 key ”等)。 MongoDB 本身和任何驱动程序都不会自动填充 _id 字段,顶级文档除外。

特别是在 Java 中,如果您希望为嵌入文档中的 _id 字段生成 ObjectId 值,您可以这样做:

someEmbeddedDoc._id = new ObjectId();

关于java - MongoDB 嵌入式对象没有 ID(空值),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11255100/

相关文章:

java - LibGDX - 从大的TextureRegion加载TiledMap图 block 集

java - Spring:无法将 SameSite cookie 设置为 None

java - 启用 ssl 的 spring mvc - 没有可用的 session 属性

java - JLabel 数组的显示速度很慢

java - Craftercms : How to define a singleton service bean (written in groovy) in Spring?

java - 当鼠标退出元素 JFrame 时停止 mouseEntered 执行

java - 将逻辑注入(inject)到 spring 组件扫描过程中

java - 使用 mondodb 在 Java 中找不到类 com.mongodb.BasicDBObject 错误的编解码器

java - spring boot 不在 application.properties 中使用 MongoDB uri

node.js - 在node.js/mongoDB中更新时发送后无法设置 header