spring Mongodb查询索引报错 java.lang.NumberFormatException: empty String
最近事情比较多,本篇文章算是把遇到的问题杂糅到一起了。
背景:笔者最近在写一个mongo查询小程序,由于建立索引时字段名用大写,而查询的时候用小写。
代码如下:
db.getCollection("xxx.aa").find({second_email:"/^mylove_foryou@qq.com/"})
1200万的数据,第一次执行耗时:43.741秒,这在正式环境肯定是不允许的。
通过查询执行计划,发现并没有使用时索引,导致查询的时候很慢。

笔者在mongo3.4/4.0环境下使用以下命令创建索引,
db.getCollection("xxx.com").createIndex({
    SECOND_EMAIL: ""
}, {
    name: "email1"
})
而是用表结构字段大小写,则会使用索引

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

由于将来还有很多不确定的表结构进来,也懒得在查询时去维护字段名大小写,
最终想到通过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.<init>(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配置如下
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-commons</artifactId>
<version>2.0.0.M1</version>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-mongodb</artifactId>
<version>2.0.0.M1</version>
</dependency>
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>bson</artifactId>
<version>3.9.1</version>
</dependency>
如果使用2.0.1版本则不需要那个bson的jar包,最初怀疑是框架bug,想整合新版本(2.13)进去,浪费了好久时间最终没能成功。
又回到了2.0.0.M1,最终硬着头皮调试。
用navicat mongo查看索引,的确是没有排序

后来想到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"
})
spring Mongodb查询索引报错 java.lang.NumberFormatException: empty String的更多相关文章
- Exception in thread “main” com.google.gson.JsonSyntaxException: java.lang.NumberFormatException: empty String
		
String json="A valid json"; Job job = new Gson().fromJson(json, Job.class); Exception in t ...
 - hadoop ha环境下的datanode启动报错java.lang.NumberFormatException: For input string: "10m"
		
hadoop ha环境启动start-dfs.sh的时候datanode启动不了,并且报错. [hadoop@datanode2 ~]$ cat /home/hadoop/hadoop-2.7.3/l ...
 - mybatis mapper.xml  写关联查询 运用 resultmap 结果集中 用 association 关联其他表 并且 用 association 的 select 查询值 报错 java.lang.IllegalArgumentException: Mapped Statements collection does not contain value for mybatis.map
		
用mybaits 写一个关联查询 查询商品表关联商品规格表,并查询规格表中的数量.价格等,为了sql重用性,利用 association 节点 查询 结果并赋值报错 商品表的mapper文件为Gooo ...
 - java.lang.NumberFormatException: empty String 错误
		
原因:前台获取的字符串,后台类型转换,与之对应的实体类中却是Integer类型,所以会报错. 排错情况:1.先检查数据库与实体类中的类型是否一致 2.检查类型转换代码,如果需要加入异常处理
 - 解决 Spring Oauth2 RedisTokenStore storeAccessToken 报错 java.lang.NoSuchMethodError: org.springframework.data.redis.connection.RedisConnection.set
		
原因是Spring 版本兼容问题 参考: https://blog.csdn.net/smollsnail/article/details/78954225 继承 RedisTokenStore 修改 ...
 - solr索引报错(java.lang.OutOfMemoryError:GC overhead limit exceeded)
		
配置文件修改如下: <dataSource driver="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3 ...
 - Window启动Zookeeper报错java.lang.NumberFormatException: For input string:
		
用zkServer start命令报如题的错误,改为直接用zkServer启动则ok 还有在window下,myid文件不能是myid.txt,不能带文件格式 dataDir=D:/zookeeper ...
 - Spring boot Unable to start embedded Tomcat报错 java.lang.NoSuchMethodError: javax.servlet.ServletContext.getVirtualServerName()
		
Spring boot Unable to start embedded Tomcat 报错 java.lang.NoSuchMethodError: javax.servlet.ServletCon ...
 - 解决spring boot启动报错java.lang.NoClassDefFoundError: ch/qos/logback/classic/Level
		
解决spring boot启动报错java.lang.NoClassDefFoundError: ch/qos/logback/classic/Level 学习了:https://blog.csdn. ...
 
随机推荐
- C7.cpp
			
Arr[i]==*(ar+i) &arr[i]==ar+i 编译过程的最终产品是可执行程序------由一组机器语言指令组成 内联函数的优点是速度快,但是会占用很多内存,若是在 ...
 - NLTK——常用函数
			
1.Functions Defined for NLTK's Frequency Distributions Example Description fdist = FreqDist(samples) ...
 - linux网编 静态链接库
			
-L 指定动态库路径 -l 指定 以libXXXX.a命名的库文件
 - 验证demo
			
// chenwenjun.cpp : 定义控制台应用程序的入口点.//#include "stdafx.h"#include <iostream>#include & ...
 - 关于全局变量,static,define和const
			
其实按照现在主流的观点,应该尽量少用全局变量和define,尽量多用临时变量,并且用const替换值define,用短小精悍的函数替换函数define. 对这些我倒是也没有什么意见,只 ...
 - java中对list进行分页显示数据到页面
			
http://blog.csdn.net/Tang_Mr/article/details/76212184#10006-weixin-1-52626-6b3bffd01fdde4900130bc5a2 ...
 - 分享一个微信自动跳转外部浏览器下载app的api接口!
			
现在微信渠道可以说是拉新最快的渠道,因为微信具备强裂变性.但是目前微信对第三方下载链接的拦截是越来越严格了,那么想要在微信内肆无忌惮地推广链接就需要用到微信跳转浏览器的接口,那如何获取该接口呢? ...
 - XML文档的生成和解析操作方法
			
XML文档和JSon文档同为网络传输中的数据格式,JSon的解析和创建已经在新浪微博的使用中相当熟悉,故仅仅记载XML文档的相关方法. 关于XML文档: 1.一种便于编辑和传输的数据文件格式 2.xm ...
 - Redis阻塞诊断基础
			
slowlog Redis慢查询 slowlog 参数 slowlog-log-slower-than: 慢查询时间阈值,超过这个阈值的查询将会被记录,默认值10000,但是微妙,也即10毫秒. sl ...
 - win10 开发mfc 64位 ocx控件
			
问题1.模块“XXX.ocx”加载失败 解决办法:项目--〉属性--〉常规-〉配置类型-〉 动态库(.dll) 修改为 静态库(.lib) 问题2.1>x64\Release\stdafx.o ...