db.getCollection('ddzinttest').find({"age":{$gt:"3"}})
那么这种问题该怎么解决呢。Mongo中有一种**$where**查询,这种查询是可以解决这样需求,
db.getCollection('ddzinttest').find({"$where":"this.age>3"})
db.getCollection('ddzinttest').find({$where:function(){return this.age>3}})
db.getCollection('ddzinttest').find({$where:function(){ for(var i =0;i<this.Child.length;i++){ var currentChild=this.Child[i]; if(currentChild.key==='123'&¤tChild.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");
}
}