mongodb中根据集合中的字段关系返回查询结果
2016-10-25 14:31
309 查看
在工作中同事遇到个问题问我,我竟然一时还真不知道怎么处理,问题如下所示:
描述:有个积分表,用于记录用户的一些积分情况,其中有两个字段,score用于记录用户当前积分,totalscore用于记录用户的历史总积分(只增不减),因为代码逻辑问题,导致现网出现了score竟然比历史总积分还要高,想找出有这种情况的那些用户,数据是保存在mongodb中的。
针对这个问题,因为之前没遇到过,所以一时间不知道怎么写语句,今天稍微看了下,这里记录下处理办法。
因为平时在查询时都是跟固定值比较大小,但是现在的问题是集合内部两个字段比较大小,还是有点不同的。
通过查看mongodb的官网,我们在查询时可以使用$where关键字集合javascrit表达式进行查询,针对上面的问题,可以如下进行统计处理:
db.score.find({$where:"this.score > this.totalscore"});
备注说明:
(1)从官网$where的说明可以看出,该关键词后面既可以跟上一个js字符串,也可以跟上一个js函数。
(2)如果是判断两个字段相等,使用"this.score == this.totalscore",只用一个“=”号是不行的。
(3)这里的this其实指的就是遍历的每条文档记录;
我们都知道,使用上面的命令其实只能在控制台看到结果,但是如果记录比较多,那么在控制台观察就不是很方便了,这时候就需要我们保存到文件中。怎么做呢?
我们需要编写一个js函数,然后执行这个js将输出重定向到一个文件。
首先我们看下Js怎么写?testCompare.js如下所示:
conn = new Mongo("127.0.0.1:27017");
db = conn.getDB("test");
db.score.find({$where:"this.score > this.totalscore"}).forEach(
function(item){
printjson(item);
}
)
然后在控制台执行该js脚本,具体如下所示:
mongo 127.0.0.1:27017/test ****/testCompare.js > test.json
执行完命令之后就会将查询出来的匹配结果保存到test.json文件中,如果需要定制输出格式,可以修改printjson(item)语句。
比如我们想把每条记录作为一行,每行按照score和totalscore的先后顺序以英文模式逗号分开,则我们可以把printjson(item)修改为:
print(item.score+","+item.totalscore);
希望能帮助到有需要的人,谢谢。
描述:有个积分表,用于记录用户的一些积分情况,其中有两个字段,score用于记录用户当前积分,totalscore用于记录用户的历史总积分(只增不减),因为代码逻辑问题,导致现网出现了score竟然比历史总积分还要高,想找出有这种情况的那些用户,数据是保存在mongodb中的。
针对这个问题,因为之前没遇到过,所以一时间不知道怎么写语句,今天稍微看了下,这里记录下处理办法。
因为平时在查询时都是跟固定值比较大小,但是现在的问题是集合内部两个字段比较大小,还是有点不同的。
通过查看mongodb的官网,我们在查询时可以使用$where关键字集合javascrit表达式进行查询,针对上面的问题,可以如下进行统计处理:
db.score.find({$where:"this.score > this.totalscore"});
备注说明:
(1)从官网$where的说明可以看出,该关键词后面既可以跟上一个js字符串,也可以跟上一个js函数。
(2)如果是判断两个字段相等,使用"this.score == this.totalscore",只用一个“=”号是不行的。
(3)这里的this其实指的就是遍历的每条文档记录;
我们都知道,使用上面的命令其实只能在控制台看到结果,但是如果记录比较多,那么在控制台观察就不是很方便了,这时候就需要我们保存到文件中。怎么做呢?
我们需要编写一个js函数,然后执行这个js将输出重定向到一个文件。
首先我们看下Js怎么写?testCompare.js如下所示:
conn = new Mongo("127.0.0.1:27017");
db = conn.getDB("test");
db.score.find({$where:"this.score > this.totalscore"}).forEach(
function(item){
printjson(item);
}
)
然后在控制台执行该js脚本,具体如下所示:
mongo 127.0.0.1:27017/test ****/testCompare.js > test.json
执行完命令之后就会将查询出来的匹配结果保存到test.json文件中,如果需要定制输出格式,可以修改printjson(item)语句。
比如我们想把每条记录作为一行,每行按照score和totalscore的先后顺序以英文模式逗号分开,则我们可以把printjson(item)修改为:
print(item.score+","+item.totalscore);
希望能帮助到有需要的人,谢谢。
相关文章推荐
- 在使用Hibernate时,因为一个查询需要更多的表连接而要使用SQL来解决性能问题。然而返回的结果集中包含了没有映射的Entity类中的表字段,在这个SQL中还有使用如何将层次关系的父子结点显示为横行
- spring-data-mongodb查询结果返回指定字段
- spring-data-mongodb查询结果返回指定字段
- Spring boot + MyBatis 查询返回Map时设置值为null的字段也在结果集中
- 06Mybatis_入门程序——根据用户的名字模糊查询返回List集合
- MongoDB文档翻译-CRUD操作-从查询中返回投影字段
- Projections-Java下MongoDB查询限制返回字段
- Mybatis按SQL查询字段的顺序返回查询结果
- 查询出来的结果根据某一字段进行分类
- SQLserver动态查询(表名或字段动态),并且获取想得到的返回值结果execsp_execute
- 多对多关系中,根据其中一个字段查询另一个字段(createAlias)
- ORACLE实现存储过程返回查询结果集合的方法
- Mongodb对查询结果中的某个重复字段进行去重
- linq查询结果转换为指定字段类型的list集合
- 查询数据库的 sql语句 返回字段 和类 属性的关系
- SQL server 动态查询(表名或字段动态),并且获取想得到的返回值结果
- 解决mybatis使用char类型字段查询oracle数据库时结果返回null问题
- 数据库表设计时一对一关系存在的必要性 数据库一对一、一对多、多对多设计 面试逻辑题3.31 sql server 查询某个表被哪些存储过程调用 DataTable根据字段去重 .Net Core Cors中间件解析 分析MySQL中哪些情况下数据库索引会失效
- 项目____DUPLICATE、int/varchar、根据多字段排序、根据查询结果反查
- SpringMVC查询返回集合,不能自定义字段对象的解决方法