這篇文章給大家介紹spring-data-MongoDB使用mongoTemplate操作mongoDb時@Indexed注解無效且沒有自動創(chuàng)建索引該怎么辦,內(nèi)容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
創(chuàng)新互聯(lián)于2013年創(chuàng)立,先為索縣等服務(wù)建站,索縣等地企業(yè),進行企業(yè)商務(wù)咨詢服務(wù)。為索縣企業(yè)網(wǎng)站制作PC+手機+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問題。
先上代碼 ,下面的 “異?!?代碼是否會自動創(chuàng)建索引呢?
//訂單doc @Data @Accessors(chain = true) @FieldNameConstants @Document(collection = "order_") public class Order implements Serializable { @Id private String id; @Indexed private String tid; @Indexed private String tradeId; private String status; private String created; } //使用mongoTemplate做插入操作,按照月份分表 mongoTemplate.insert(orderRecord, mongoTemplate.getCollectionName(Order.class) + month);
答案是 :會的!
那為什么說是異常代碼呢,因為它沒有達到我的預(yù)期,這段代碼會有兩個問題:
1、會在mongodb里邊創(chuàng)建兩個 collection : order_ 和 order_${month}
2、索引會創(chuàng)建在 “order_” 這個collection里邊,而不會在 “order_${month}”
這個時候答案就很明顯了:自動創(chuàng)建索引的時候 ,讀取的collectionName 是 @Document注解里邊的值,而不是 insert的時候傳入的值。
結(jié)論已經(jīng)有了,就該看看它是怎么把傳入的 collectionName弄丟的了
通過debug可以找到創(chuàng)建索引相關(guān)類以及方法的調(diào)用路徑:
這個是方法簽名:
checkForIndexes((MongoPersistentEntity>) entity);
最終只剩下了entity。通過entity的@Document注解來獲取collectionName。細節(jié)就不貼圖了,建議去debug下看看源碼。
原因找到了,最終要如何解決當前的問題呢?上代碼:
//字段索引 IndexOperations indexOps2 = mongoTemplate.indexOps(orderCollectionName); String[] indexFields2 = Arrays.stream(Order.class.getDeclaredFields()) .filter(f -> f.isAnnotationPresent(Indexed.class)) .map(Field::getName) .toArray(String[]::new); for (String indexField : indexFields2) { if (StringUtils.hasText(indexField)) { indexOps2.ensureIndex(new Index(indexField, Sort.Direction.ASC)); } }
至此,問題解決。
最后別忘了把@Document注解去掉。
關(guān)于spring-data-mongodb使用mongoTemplate操作mongoDb時@Indexed注解無效且沒有自動創(chuàng)建索引該怎么辦就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。