当把一个数值类型存成了字符串,如何对该字符串进行数值比较。
先上mongodb中的数据结构:
db.test1.insert({
"modelId": "111",
"patientId": "222",
"patientName": "333",
"sex": "14",
"birthday": "2020-08-06",
"count": "10"
})
现在我们要写一个查询语句,查询出count > 2的SQL,正常我们都会想到 $gt 操作符来编写,那我们现在试一下:
db.test1.find({'count' : {'$gt' : 2}});
在navicat中执行了上面这句sql,发现查询结果为空,什么都没查询出来
其实,这个结果不难猜到,由于数据类型为字符型,当对字段做比较的时候,mongodb会用ASCII进行比较,字符串的ASCII码比较规则为:从首字母开bai始,先比较第一个,再比较第二个,依次比较。字符串“2”的ASCII值比“10”的第一个”1“的ASCII大,查询结果为空。
那我们要怎么才能解决这个问题呢?
1、我们从源头入手,这个问题的关键点就在于用字符串类型存了数值,那只要把字符串类型改为数值类型,这个问题也就解决了,下面我们试一下。
这样就能查出来了,但可能你的业务决定你必须用字符串类型存储数值怎么办?别怕,还有一种解决方案。
2、mongodb提供了一种 $where 的查询方法,用这个查询可以在sql里面编写任意的JavaScript语句,下面试一下。
还是字符串类型存了数值
db.test1.find({'$where' : function () {return this.count > 2}});
执行上面这个SQL,发现有查询结果了,说明这个方法是可行的。
但是要补充一个:这个方法不能与 $elemMatch 共用,而且由于这个查询过程是先将每个文档都要从BSON转换成JavaScript对象,然后通过"$where"表达式来运行。而且"$where"语句不能使用索引,所以只在走投无路时才考虑"$where"这种用法。
所以还是推荐数值就是数值类型来存储,避免不必要的麻烦。