@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 - 如何通过嵌套属性进行查询
Spring boot / mongo 不会使用索引注释创建索引