@Indexed 嵌套属性在 mongo 的 Spring-data 中不起作用

Posted

技术标签:

【中文标题】@Indexed 嵌套属性在 mongo 的 Spring-data 中不起作用【英文标题】:@Indexed on nested property not working in Spring-data for mongo 【发布时间】:2014-04-13 11:28:42 【问题描述】:

我有以下对象结构:

@Document(collection = "user")
@TypeAlias("user")
public class User 
    @Id
    private ObjectId id;
    private Contact info = new Contact();

这里是联系方式:

public class Contact 
    @Indexed(unique = true)
    private String mail;

但由于某些我不知道的原因,我没有看到 Spring-data 为属性 info.mail

创建唯一索引

总而言之,我有这个用户对象的 json 结构: _id:xxxxx,info:mail:"abc@xyz.shoes"

并且我想使用具有上述 pojo 结构的 Spring 数据在 info.mail 上创建一个唯一索引。请帮忙。

【问题讨论】:

你用的是哪个版本的spring-data-mongodb? 【参考方案1】:

据我所知,使用 @Indexed 注释嵌入字段是行不通的。 @CompoundIndex 是要走的路:

@Document(collection = "user")
@TypeAlias("user")
@CompoundIndexes(
    @CompoundIndex(name = "contact_email", def = " 'contact.mail': 1 ", unique = true)
)
public class User 
    @Id
    private ObjectId id;
    private Contact info = new Contact();

【讨论】:

你能不能在这里指导我:***.com/questions/61948943/… 如有必要,您可能必须使用@Field 注释,如here 所述。但是,如果我删除外部 @CompoundIndexes 标记并仅使用 @CompoundIndex 注释,它对我来说工作正常。【参考方案2】:

就我而言,我有一个全新的 Spring Boot 应用程序 2.3.0,只有 @Document、@Id 和 @Indexed 注释。我能够检索和插入文档,但它拒绝创建 PK 以外的索引。最后我发现你需要启用一个属性。

spring.data.mongodb.auto-index-creation = true

事实上,它甚至可以在没有@Document 注释的嵌套对象上工作。

希望这会有所帮助:)

【讨论】:

对于'AbstractMongoClientConfiguration',即'public boolean autoIndexCreation()',默认为false。【参考方案3】:

过时的答案,这是 mongodb 1.x 的旧版本。


遇到同样的问题,您的 Contact 类似乎缺少 @Document 注释,即

@Document
public class Contact 
    @Indexed(unique = true)
    private String mail;

应该可以,引用spring mongodb reference

自动索引创建仅适用于使用 @Document 注释的类型。

【讨论】:

我认为任何嵌入的文档都不需要@Document,因为它不是真正的文档,而只是文档的归档。 当然,但是您仍然需要提示 Spring MongoDB DSL 实现如何转换和使用它应该 index 的类。 Spring MongoDB 将在内部为每个使用 @Document 注释的类解析类,并为其应用 @Indexed 选项。如果需要,您可以通过 mongo 控制台或通过 java 代码 应用自动 index。但是,如果您想从 Spring 为您提供的自动功能中受益,您只需要遵循文档中的规则:P 否则 Spring Mongo 实现会有点困难,只解析嵌入代码中的所有 java 文件并检查每个带注释的类的所有字段带有@Indexed 注释。代码库越大,花费的时间就越多。所以他们有@Document 的原因是提示Spring Mongo 实现要检查哪些文件并应用@Indexed 选项(如果设置)。 我的意思是你不需要在嵌入文档中添加任何注释。如果您需要索引嵌入文档的字段,您应该在父类上使用@CompoundIndex。 @Adnan 很抱歉回复晚了,这个答案是针对较旧的 mongo db 驱动程序,我已将答案标记为过时。

以上是关于@Indexed 嵌套属性在 mongo 的 Spring-data 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot 和 Mongo - 如何通过嵌套属性进行查询

Solr的Filed中indexed与stored属性

通过嵌套对象的属性修改嵌套对象的数组

Spring boot / mongo 不会使用索引注释创建索引

Spring data Mongo Audit 字段反映在嵌套文档中

$lookup 嵌套对象数组