以下结构:
@Document
public class Palace {
@Id
private String id;
private Location location;
// additional attributes, getter, setter
}
.
public class Location {
private String id;
// additional attributes, getter, setter
}
据我所知,ObjectId的概念是,MongoDB文档中只能有一个ObjectId(\u id),它必须位于文档的根级别。但当通过Spring Boot 1.5.14插入数据时,我得到以下结构:
{
"_id" : ObjectId("5b05387a8db58e0001d38851"),
"location" : {
"_id" : ObjectId("5ae712d1b2b197000132cd9b"),
}
}
我的问题是:这是Spring data-mongo中的预期行为吗?我预计会有以下结构:
{
"_id" : ObjectId("5b05387a8db58e0001d38851"),
"location" : {
"id" : "5ae712d1b2b197000132cd9b",
}
}
如果我用@Field注释位置ID
public class Location {
@Field("id")
private String id;
// additional attributes, getter, setter
}
然后按预期保存文档,但使用repository方法进行查询
getPalaceByLocationId()
不会给出任何结果。
对id领域的一些见解。在spring数据mongodb中,id字段的处理略有不同。
看看留档。
为您的案例扩展文档,当您声明这样的id时
public class Location {
private String id;
// additional attributes, getter, setter
}
它作为id存储在数据库中。您可以通过查看数据库进行交叉检查。使用Id对其进行注释时也是如此
{
"_id" : ObjectId("5b31fad36a19cc45db205056"),
"location" : {
"_id" : ObjectId("5ae712d1b2b197000132cd9b")
}
}
5AE712D1B2B19700132CD9B是您使用位置设置的id。setId()。在内部,它被转换为ObjectId,并存储为id。
但是当您添加@Field
注释时,情况会发生变化。让我们假设您添加了这样的注释
@Field("id")
private String id;
然后,该文档在数据库中看起来像这样。
{
"_id" : ObjectId("5b31fad36a19cc45db205056"),
"location" : {
"id" : "5ae712d1b2b197000132cd9b"
}
}
问题是您无法按id检索。因为当您编写findPalaceByLocationId或findByLocation\u id时,它(spring数据)会尝试查找不存在的id字段。
唯一的办法就是像这样使用它
@Field
private String id;
或者只是
private String id;
这将在数据库中创建id,您可以执行findByLocationId
我知道这有点粗略。但这就是它的工作原理。
和关于
据我所知,ObjectId的概念是,MongoDB文档中只能有一个ObjectId(\u id),它必须位于文档的根级别。
这是不正确的。
关于映射的小信息表
Field definition Resulting Id-Fieldname in MongoDB
String id _id
@Field String id _id
@Field('x') String id x
@Field('id') String id id (InAccessible)
@Id String x _id
@Field('x') @Id String x _id
我不知道如何在Java类中处理嵌套的JSON值。为了尽可能简单,我创建了四个Java类,每个类都有“嵌套级别”。然而,我试图在一个Java类中包含所有这些值。我该怎么做? Json: Java类:
我有两个嵌套的case类: 当然,解决方案应该是泛型的,并且适用于任何case类。 注意:这个讨论很好地回答了如何将单个case类映射到映射。但我无法将其用于嵌套的case类。相反,我得到了:
问题内容: 我正在尝试为如下对象创建动态映射: 我希望属性为嵌套类型,该类型是我在下面的映射中使用nested_feature模板定义的,并且按预期工作。但是,我也想让属性的嵌套对象中的每个属性都带有定义的其他属性。我尝试了第二个nested_template模板,但没有成功。 不幸的是,属性中的属性是从另一个进程创建的,几乎可以是任何名称/值对。关于如何使用动态模板将属性设置为嵌套的任何建议,以
我试图为对象创建一个动态映射,如下所示:
随着ElasticSearch计划删除映射类型,这是否也意味着不再使用嵌套文档和嵌套查询?ElasticSearch将如何支持无类型上下文中的嵌套对象查询? 我正在考虑的功能是能够只返回匹配搜索条件的嵌套数组中的命中。 编辑1:ElasticSearch版本6中的映射查询示例 ElasticSearch 6映射 ElasticSearch 6查询
这是我的employee.hbm.xml: 所以,您可以注意到,在我的类中,它没有“id”属性。但是,我在数据库中创建id列,让它成为自动生成的主键。在这种情况下,我不知道应该在将我的类映射到我的数据库。如果我忽略了它,会不会是后来的一些问题呢?