我有一个这样的pojo注释:
@Document
class Car {
@Id
String id ;
@Indexed
String manufacturer ;
}
我正在使用MongoTemplate
插入mongo。如果我插入而没有指定集合名称,一切正常。但是,如果我指定了集合名称,则除了_id
之外,不会创建任何索引。
我真的需要能够手动指定集合名称,因为:
Car
的不同子类最终出现在同一个集合中Cars
存储在一个单独的集合中我是否必须亲自致电ensureIndex()
?如果是这样,有没有办法使用我的@Indexed
注释?我试图保存的实际对象比“Car”
答案 0 :(得分:5)
不幸的是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()
。
这是奇怪的行为。我想你可以在这里打开bug:DATAMONGO
修改强>
我认为您可以创建函数来返回所有使用@Document
注释的类,并且还可以从cars.<year>
开始从mongodb获取所有集合。然后,您可以分析使用@Indexed
注释的所有字段,并因此使用集合列表为此字段调用ensureIndex
。
答案 1 :(得分:2)
我真的需要能够手动指定集合名称,因为:
I need to ensure different subclasses of Car end up in the same collection
I would like to store each year's worth of Cars in a separate collection
至于您的第一个声明,您可以使用@Document
元数据注释强制执行单个集合:
@Document(collection="cars")
class Car {
@Id
String id ;
@Indexed
String manufacturer ;
}
@Document(collection="cars")
class Honda extends Car {
}
@Document(collection="cars")
class Volvo extends Car {
}
@Document
的集合字段将关注汽车的每个子类进入汽车集合,并且在@Indexed
注释的帮助下自动创建索引。
答案 2 :(得分:0)
您最好弯腰到数据库级别并使用getIndexes检查集合是否包含您需要的索引,并在应用程序启动时调用ensureIndex。
提示:在为您的应用程序配置mongo的类上实现InitializingBean并在那里发挥魔力。
没有讲道,恕我直言春天擅长某些事情,而另一些人也是如此。我试图避免除DI&amp;之外的膨胀非XA环境中的TXN管理。