java - 使用命名集合时忽略 @Indexed 注释

标签 java spring mongodb spring-data spring-data-mongodb

我有一个这样注释的 pojo:

@Document
class Car {

  @Id
  String id ;

  @Indexed
  String manufacturer ;

}

我正在使用 MongoTemplate 插入 mongo。如果我在不指定集合名称的情况下插入,一切正常。但是,如果我指定集合名称,则除了 _id 之外,不会创建任何索引。

我确实需要能够手动指定集合名称,因为:

  • 我需要确保 Car 的不同子类最终在同一个集合中
  • 我想将每年的 Cars 值(value)存储在一个单独的集合中

我必须自己手动调用 ensureIndex() 吗?如果是这样,有没有办法使用我的 @Indexed 注释?我要保存的实际对象比“汽车”复杂得多

最佳答案

不幸的是MongoTemplate功能

public void insert(Object objectToSave, String collectionName)

使用 collectionName仅用于保存对象而不用于创建任何带注释的索引。 如果对象传递给保存操作,则应用程序事件监听器 MongoPersistentEntityIndexCreator扫描 @Indexed 的已保存实体类注释和创建索引。但它会根据下一个公式(来自来源)检测集合名称:

String collection = StringUtils.hasText(index.collection()) ? index.collection() : entity.getCollection();

在哪里 index.collection()是从 @Indexed 收集的注释和 entity.getCollection()来自 @Document注释。

所以,您需要调用 ensureIndex()手动。 这是奇怪的行为。我想你可以在这里打开错误:DATAMONGO

编辑: 我认为您可以创建返回所有带有 @Document 注释的类的函数并且还从 cars.<year> 开始从 mongodb 获取所有集合.然后你可以分析所有用@Indexed注释的字段因此,请调用 ensureIndex为此字段使用集合列表。

关于java - 使用命名集合时忽略 @Indexed 注释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17914725/

相关文章:

java - 如何用Java调用一个新的记事本并将其保存在windows中的目录中?

java - 报告短语中所有字符与字母表中所有字符的匹配状态

java - Spring启动Jsp文件找不到

c# - 在 C# 的 MongoDB 驱动程序中使用 $addFields

mongodb - 使用 Azure MongoDB 的 Meteor

java - 将用户提供的 javascript 代码从网页表单存储到数据库时的安全性

java - 将多张图片合二为一

java - Android 从非 Activity 类获取上下文

java - 为什么 JPA Repository 保存方法不更新生产中的实体详细信息?

java - index.jsp 不起作用,仅在浏览器上显示源代码