mongodb 索引 java_spring Mongodb查询索引报错 java.lang.NumberFormatException: empty String

最近事情比较多,本篇文章算是把遇到的问题杂糅到一起了。

背景:笔者最近在写一个mongo查询小程序,由于建立索引时字段名用大写,而查询的时候用小写。

代码如下:

db.getCollection("xxx.aa").find({second_email:"/^mylove_foryou@qq.com/"})

1200万的数据,第一次执行耗时:43.741秒,这在正式环境肯定是不允许的。

通过查询执行计划,发现并没有使用时索引,导致查询的时候很慢。

7b6b119023047dc13ced815243bccdcd.png

笔者在mongo3.4/4.0环境下使用以下命令创建索引,

db.getCollection("xxx.com").createIndex({

SECOND_EMAIL: ""}, {

name: "email1"})

而是用表结构字段大小写,则会使用索引

011a550471c26afb1400021b9b6b5fc1.png

笔者是通过配置文件将原始字段(from属性)映射成xx系统内标准字段(to属性)名称。

1b077ed46725c6639ae87e4714bd54f2.png

由于将来还有很多不确定的表结构进来,也懒得在查询时去维护字段名大小写,

最终想到通过to属性给定的字段名,进行字符串比较,匹配对应集合(collection)中实际字段大小写,翻译成建立索引的字段名。

例如查询时使用realname,而建立索引使用second_email,通过遍历索引,把second_email转译成SECOND_EMAIL,以便使用索引。

于是编写执行以下demo查询索引

mongoTemplate.indexOps(collection).getIndexInfo(); #笔者正式环境不是这么写的,这里方便大家理解,使用语法糖式代码 ;p

每次走到xxx.com表的时候总是报错

Exception in thread "Configuration Initializer"java.lang.NumberFormatException: empty String

at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1842)

at sun.misc.FloatingDecimal.parseDouble(FloatingDecimal.java:110)

at java.lang.Double.parseDouble(Double.java:538)

at java.lang.Double.(Double.java:608)

at org.springframework.data.mongodb.core.IndexConverters.lambda$getDocumentIndexInfoConverter$1(IndexConverters.java:147)

at org.springframework.data.mongodb.core.DefaultIndexOperations$1.getIndexData(DefaultIndexOperations.java:126)

at org.springframework.data.mongodb.core.DefaultIndexOperations$1.doInCollection(DefaultIndexOperations.java:116)

at org.springframework.data.mongodb.core.DefaultIndexOperations$1.doInCollection(DefaultIndexOperations.java:110)

at org.springframework.data.mongodb.core.DefaultIndexOperations.execute(DefaultIndexOperations.java:141)

at org.springframework.data.mongodb.core.DefaultIndexOperations.getIndexInfo(DefaultIndexOperations.java:110)

at com.xmd.model.db.MongoDBHelper$1.run(MongoDBHelper.java:97)

at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)

at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)

at java.lang.Thread.run(Thread.java:748)

本地是jar版本是托管给maven,笔者本地mongodb配置如下

org.springframework.data

spring-data-commons

2.0.0.M1

org.springframework.data

spring-data-mongodb

2.0.0.M1

org.mongodb

bson

3.9.1

如果使用2.0.1版本则不需要那个bson的jar包,最初怀疑是框架bug,想整合新版本(2.13)进去,浪费了好久时间最终没能成功。

又回到了2.0.0.M1,最终硬着头皮调试。

用navicat mongo查看索引,的确是没有排序

5f7a77190a1d724577883a7605c23cb7.png

后来想到mongo控制台创建索引有1,-1两个值,1是正序 -1是倒序;而笔者创建索引时指定了空字符串,格式化自然就失败了,于是到官方查询文档

db.collection.createIndex(keys, options)

For an ascending index on a field, specify a value of 1; for descending index, specify a value of -1.

问题的症结就是没有建立索引,到这里基本解决问题了,方法如下:

1、删除索引

db.getCollection('xxx.com').dropIndex("mobile_mac")

2、重建索引

db.getCollection("xxx.com").createIndex({

mobile:1}, {

name:"mobile_mac"})

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值