Java @在mongo的Spring数据中嵌套属性不起作用的索引

Java @在mongo的Spring数据中嵌套属性不起作用的索引,java,spring,mongodb,spring-data-mongodb,Java,Spring,Mongodb,Spring Data Mongodb,我有以下对象结构: @Document(collection = "user") @TypeAlias("user") public class User { @Id private ObjectId id; private Contact info = new Contact(); } 以下是联系方式pojo: public class Contact { @Indexed(unique = true) private String mail; }

我有以下对象结构:

@Document(collection = "user")
@TypeAlias("user")
public class User {
    @Id
    private ObjectId id;
    private Contact info = new Contact();
}
以下是联系方式pojo:

public class Contact {
    @Indexed(unique = true)
    private String mail;
}
但是由于一些我不知道的原因,我没有看到Spring数据为属性info.mail创建唯一的索引

总之,我有一个用户对象的json结构: {u id:xxxxx,信息:{mail:abc@xyz.shoes“}}


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

据我记忆所及,用@index注释嵌入字段将不起作用@CompoundIndex是一条路要走:

@文档(collection=“user”)
@TypeAlias(“用户”)
@复合指数({
@CompoundIndex(name=“contact_email”,def=“{'contact.mail':1}”,unique=true)
})
公共类用户{
@身份证
私有ObjectId;
私人联系人信息=新联系人();
}
过时的答案,这是MongoDB1.x的旧版本


同样的问题,您的
联系人
类似乎缺少
@文档
注释,即

@Document
public class Contact {
    @Indexed(unique = true)
    private String mail;
}
应该有效,引用

只有使用@Document注释的类型才能自动创建索引


在我的例子中,我有一个全新的spring boot应用程序2.3.0,其中只有@Document、@Id和@Indexed注释。我能够检索和插入文档,但它拒绝创建PK以外的索引。最后,我发现有一个属性需要启用

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

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


希望这有帮助:)

您使用的是哪个版本的spring data mongodb?我认为任何嵌入式文档都不需要@document,因为它不是真正的文档,只是文档的一个字段。当然,但是您仍然需要提示spring mongodb DSL实现如何转换和使用它应该索引的类。Spring MongoDB将在内部为每个使用
@Document
注释的类解析类,并为其应用
@index
选项。您可以通过mongo控制台或java代码(如果需要)应用自动
索引。但是,如果您想从Spring为您提供的自动化功能中获益,您只需遵循文档中的规则:从某种程度上讲,Spring Mongo实现会有点困难,只需解析嵌入代码中的所有java文件,并检查使用
@index
注释注释的每个类的所有字段。代码库越大,花费的时间就越多。因此,他们之所以有
@Document
是为了提示Spring Mongo实现要检查哪些文件,如果设置了
@Indexed
选项,则应用该选项。我的意思是,您不需要在嵌入的文档中添加任何注释。如果您需要为嵌入文档的某个字段编制索引,则应在父类上使用@CompoundIndex。@Adnan很抱歉,此答案是针对较旧的mongo db驱动程序的,我已将此答案标记为已过时。请在此处指导我:如有必要,您可能必须使用所述的
@field
注释。但是如果我删除外部的
@compoundexes
标记,并且只使用
@compoundexx
注释,没有它对我来说效果很好。对于'AbstractMongoClientConfiguration',这是'public boolean autoIndexCreation()',默认为false。它对我有效