@Indexed嵌套属性不适用于mongo的Spring-data

hel*_*ava 8 java spring mongodb spring-data-mongodb

我有以下对象结构:

@Document(collection = "user")
@TypeAlias("user")
public class User {
    @Id
    private ObjectId id;
    private Contact info = new Contact();
}
Run Code Online (Sandbox Code Playgroud)

这是联系人pojo:

public class Contact {
    @Indexed(unique = true)
    private String mail;
}
Run Code Online (Sandbox Code Playgroud)

但由于我不知道的一些原因,我没有看到Spring-data为属性info.mail创建一个唯一的索引

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

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

Mac*_*iak 20

据我所知,用@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();
}
Run Code Online (Sandbox Code Playgroud)


Xen*_*ius 8

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

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

事实上,它甚至适用于没有 @Document 注释的嵌套对象。

希望这可以帮助 :)


cri*_*bal 5

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


有同样的问题,你的Contact班级似乎缺少@Document注释,即

@Document
public class Contact {
    @Indexed(unique = true)
    private String mail;
}
Run Code Online (Sandbox Code Playgroud)

应该有效,引用自spring mongodb 参考

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

  • 我认为任何嵌入文档都不需要@Document,因为它不是真正的文档,而只是文档的归档。 (2认同)