我有一个这样注释的 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/