文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

spring-data-mongodb使用mongoTemplate操作mongoDb时@Indexed注解无效且没有自动创建索引该怎么办

2023-06-19 12:15

关注

这篇文章给大家介绍spring-data-mongodb使用mongoTemplate操作mongoDb时@Indexed注解无效且没有自动创建索引该怎么办,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

先上代码 ,下面的 “异常” 代码是否会自动创建索引呢?

//订单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);

答案是 :会的!

那为什么说是异常代码呢,因为它没有达到我的预期,这段代码会有两个问题:

    1、会在mongodb里边创建两个 collection : order_ 和 order_${month}

    2、索引会创建在 “order_” 这个collection里边,而不会在 “order_${month}”

这个时候答案就很明显了:自动创建索引的时候 ,读取的collectionName 是 @Document注解里边的值,而不是 insert的时候传入的值。

结论已经有了,就该看看它是怎么把传入的 collectionName弄丢的了

    通过debug可以找到创建索引相关类以及方法的调用路径:

spring-data-mongodb使用mongoTemplate操作mongoDb时@Indexed注解无效且没有自动创建索引该怎么办

这个是方法签名:

checkForIndexes((MongoPersistentEntity<?>) entity);

最终只剩下了entity。通过entity的@Document注解来获取collectionName。细节就不贴图了,建议去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注解去掉。

关于spring-data-mongodb使用mongoTemplate操作mongoDb时@Indexed注解无效且没有自动创建索引该怎么办就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯