转载 

Mongo gte和lte比较字符串 不准 解决方案

分类:MongoDB,java    369人阅读    IT小君  2023-09-11 15:48

 

​        在Mongo中都知道字符串类型大小比较都是以ASCII进行比较的,所以无法真实比较字符串类型的数值大小

​        比如查询age大于3的:
db.getCollection('ddzinttest').find({"age":{$gt:"3"}}) 
    得到的结果肯定不是我们所需要的

     那么这种问题该怎么解决呢。Mongo中有一种**$where**查询,这种查询是可以解决这样需求,

db.getCollection('ddzinttest').find({"$where":"this.age>3"})
        可以看到使用**$where**是可以达到这个需求的,那**$where**这东西是什么呢:
  其实$where查询是将JavaScript表达式的字符串或函数作为查询的一部分
  Mongo是支持JS语言的,也就是说可以在Mongo中使用JS函数,也就是说其实语句可以这么写
db.getCollection('ddzinttest').find({$where:function(){return this.age>3}})
  而this.age>3是字符串形式的表达方式
  当然可以利用JS函数写一些更加复杂的查询:例如子文档中字符串的比较查询
复制代码
db.getCollection('ddzinttest').find({$where:function(){
    for(var i =0;i<this.Child.length;i++){
        var currentChild=this.Child[i];
        if(currentChild.key==='123'&&currentChild.value>'111'){
            return true;
        }
    }
    return false;
}})            
复制代码

查询子文档数组Child中key等于123并且value大于111的数据

  当然,这种复制的就不能使用字符串表达式了。

 

MongoDB将字符串按UTF-8进行字典排序比较。

 

所以单纯地用gte和lte比较字符串数值大小是行不通的。

 

最后学习了前辈代码解决:

 

String commTimeFrom = (String) queryObject.get("commTimeFrom");

String commTimeTo = (String) queryObject.get("commTimeTo");

 if (StringUtils.isNotBlank(commTimeFrom)) {

       if (StringUtils.isNotBlank(commTimeTo)) {

            query.addCriteria(Criteria.where("$where").is(

            String.format("function () { return this.commTime >= %s && this.commTime <= %s; }", commTimeFrom, commTimeTo)));

            queryObject.removeField("commTimeFrom");

            queryObject.removeField("commTimeTo");

            } else {

                 query.addCriteria(Criteria.where("$where").is(

                 String.format("function () { return this.commTime >= %s; }", commTimeFrom)));

                 queryObject.removeField("commTimeFrom");

            }

  } else {

           if (StringUtils.isNotBlank(commTimeTo)) {

                  query.addCriteria(Criteria.where("$where").is(

                  String.format("function () { return this.commTime <= %s; }", commTimeTo)));

                  queryObject.removeField("commTimeTo");

           }

           }

 

 

js+css3抽奖转盘旋转点餐代码

响应式太阳能能源公司网站模板

html5图标下拉搜索框自动匹配代码

HTML5 Canvas竖直流动线条背景动画特效

HTML5现代家居装潢公司网站模板

响应式时尚单品在线商城网站模板

现代时尚家具公司网站模板

canvas炫酷鼠标移动文字粒子特效

css+js实现的颜色渐变数字时钟动画特效

中小型创意设计服务公司网站模板

html5 svg夜空中星星流星动画场景特效

响应式咖啡饮品宣传网站模板

html5 canvas进度条圆环图表统计动画特效

css鼠标跟随文字模糊特效

html5 canvas彩色碎片组合球形旋转动画特效

小众时尚单品在线电子商务网站模板

jQuery右端悬浮带返回顶部特效

有机水果蔬菜HTML5网站模板

网页设计开发公司网站模板

HTML5数字产品服务公司网站模板

 工具推荐 更多»