MongoDB嵌入式对象没有ID(空值) [英] MongoDB Embedded Objects have no ID (null value)

查看:78
本文介绍了MongoDB嵌入式对象没有ID(空值)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我对使用Spring Data的MongoDB有疑问。
我有这些域类:

I have a question regarding MongoDB with Spring Data. I have these domain classes:

@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时将其设置为空。
为什么MongoDB不能为嵌入对象生成唯一的id?

With these domains I can successfully CRUD. There is only one problem. When saving a User with Deals, the deals and Location get _id set to null when saving them to MongoDB. Why can´t MongoDB generate unique id´s for embedded objects?

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

The result after saving a User with one deal:

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

As you can see from the result, Deal and Location ID is set to NULL.

推荐答案

MongoDB CRUD操作(插入更新查找删除)所有操作都只能在顶级文档上运行 - 当然,您可以按嵌入字段过滤文档。嵌入式文档始终在父文档中返回。

MongoDB CRUD operations (insert, update, find, remove) all operate on top-level documents exclusively -- although of course you can filter by fields in embedded documents. Embedded documents are always returned within the parent document.

_id 字段是父文档的必填字段,并且通常不需要或存在于嵌入式文档中。如果您需要唯一标识符,您当然可以创建它们,如果方便您的代码或心智模型,您可以使用 _id 字段来存储它们;更典型地,它们以它们代表的内容命名(例如username,otherSystemKey等)。除了顶级文档之外,MongoDB本身或任何驱动程序都不会自动填充 _id 字段。

The _id field is a required field of the parent document, and is typically not necessary or present in embedded documents. If you require a unique identifier, you can certainly create them, and you may use the _id field to store them if that is convenient for your code or your mental model; more typically, they are named after what they represent (e.g. "username", "otherSystemKey", etc). Neither MongoDB itself, nor any of the drivers will automatically populate an _id field except on the top-level document.

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

Specifically in Java, if you wish to generate ObjectId values for the _id field in embedded documents, you can do so with:

someEmbeddedDoc._id = new ObjectId();

这篇关于MongoDB嵌入式对象没有ID(空值)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆