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

Posted

技术标签:

【中文标题】Spring boot / mongo 不会使用索引注释创建索引【英文标题】:Spring boot / mongo wont create index with the index annotation 【发布时间】:2019-03-31 02:26:20 【问题描述】:

我有以下几点:

@Document(collection = "linkmetadata")
public class LinkMetaData 
@Indexed(unique = true)
private String url;
...

但每当它创建集合时,它不会为 url 字段创建任何索引,就像它只是忽略注释一样。知道这是为什么吗?

编辑:插入数据时也不会创建索引。当我尝试获取特定 url 的数据时,如果我两次输入相同的 url,它会抛出一个错误,即 url 键不是唯一的,但它不关心插入唯一键,因为没有索引..

【问题讨论】:

【参考方案1】:

在您的应用程序属性中使用auto-index-creation: true。在您的应用程序属性中添加波浪线

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

【讨论】:

3.0以后需要启用这个属性 你应该得到一枚奖牌 这个属性是否在每次服务启动时创建(重新创建)索引,或者像数据迁移一样工作并且不重新创建已经存在?【参考方案2】:

我发现了问题。我还有另一个集合,其中 url 字段标记为 unqiue。我必须在其中一个上指定索引的名称,否则它似乎认为索引已经存在,即使它位于两个不同的集合中

@Indexed(name = "meta_url_index_unique", unique = true)
private String url;

【讨论】:

【参考方案3】:

编辑:这个答案是在作者更新他的问题之前

我相信您需要在类声明顶部使用@Document 注释

所以你的班级应该是

@Document
public class LinkMetaData 
@Indexed(unique = true)
private String url;
...

【讨论】:

我做了我只是没有把所有东西都包括在上面,我更新了问题 感谢您的澄清!你能包括你用来启用mongo的配置吗 配置在我们的配置服务器上,我目前无法访问它。但它适用于同一服务中具有由注释创建的唯一索引的其他集合。 我想通了,发布了答案 非常感谢兄弟,不知道@Document 是必须的【参考方案4】:

我也有同样的问题。解决我的问题的一个是从 mongo db 级别添加索引

db.city.createIndex(  "name": 1 ,  unique: true  );

【讨论】:

以上是关于Spring boot / mongo 不会使用索引注释创建索引的主要内容,如果未能解决你的问题,请参考以下文章

使用 Mongo 模板在 Spring Boot 中过滤内部 Arraylist 项的 Mongo 查询

Dockerize Spring Boot mongo

如何使用 Spring Boot 在 Mongo 中存储原始 JSON

Spring Boot使用mongo的GridFS模块

Spring Boot 连接到运行的 mongo 容器的 MongoDB 副本集

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