【发布时间】:2012-06-30 14:10:18
【问题描述】:
我有一个关于 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。
【问题讨论】:
-
ID 标识根文档,而不是子文档。没有理由要为嵌套文档自动生成 id,因为 MongoDB 无论如何只能检索顶级文档。您实际上需要嵌套 id 做什么?
-
我只需要搜索交易而不是用户。现在我必须从用户中搜索,然后循环以编程方式将每笔交易扔给用户。
-
id 与您可以搜索的内容无关。搜索
{ 'deals.price' : { $gt : 1000 }}完全没问题。尽管如此,此查询仍会返回一个User对象,您必须从那时手动拉出Deal。这是 MongoDB 的限制,Spring Data 没有暗示。 -
你是对的。我已经分别保存了用户和交易,但电子邮件与他们两人共享。我现在可以单独获得交易,而无需将用户文档扔给用户,对用户也是如此。
标签: java spring mongodb spring-data