您的位置:首页 > 数据库 > Mongodb

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);

希望能帮助到有需要的人,谢谢。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  mongodb 数据库 工作
相关文章推荐