MongoDB Embedded Objects have no ID (null value)(MongoDB 嵌入式对象没有 ID(空值))
问题描述
我有一个关于 MongoDB 和 Spring Data 的问题.我有这些域类:
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 时将 _id 设置为 null.为什么 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 操作(insert、update、find、remove) 都只对顶级文档进行操作——当然您可以按嵌入文档中的字段进行过滤.嵌入文档总是在父文档中返回.
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 字段来存储它们,如果这对你的代码或你的心智模型来说很方便的话;更典型的是,它们以它们所代表的内容命名(例如用户名"、其他系统密钥"等).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(空值)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:MongoDB 嵌入式对象没有 ID(空值)
- Eclipse 插件更新错误日志在哪里? 2022-01-01
- C++ 和 Java 进程之间的共享内存 2022-01-01
- Safepoint+stats 日志,输出 JDK12 中没有 vmop 操作 2022-01-01
- 如何使用WebFilter实现授权头检查 2022-01-01
- Spring Boot连接到使用仲裁器运行的MongoDB副本集 2022-01-01
- value & 是什么意思?0xff 在 Java 中做什么? 2022-01-01
- 从 finally 块返回时 Java 的奇怪行为 2022-01-01
- 将log4j 1.2配置转换为log4j 2配置 2022-01-01
- Java包名称中单词分隔符的约定是什么? 2022-01-01
- Jersey REST 客户端:发布多部分数据 2022-01-01
