当前位置: 首页 > 知识库问答 >
问题:

映射为MongoDb ObjectId()的嵌套Java类中的id属性

马祺
2023-03-14

以下结构:

@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()

不会给出任何结果。

共有1个答案

呼延沈义
2023-03-14

对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列,让它成为自动生成的主键。在这种情况下,我不知道应该在将我的类映射到我的数据库。如果我忽略了它,会不会是后来的一些问题呢?