Rails rails 中使用 mongodb 查询结果与预期不同

hging · 2014年06月18日 · 最后由 Rei 回复于 2014年06月20日 · 2791 次阅读

首先给出两行查询代码: 1、 Shop.collect{|s| puts s.id if s.recommend == 1}

2、 Shop.where(:recommend => 1).collect{|s| puts s.id}

想要实现的结果就是 查出所有 Shop 表中字段 recommend 的值为 1 的数据

预期结果代码 1 的返回是正常的,但是代码 2 返回的结果少于预期值。

然后对比代码 2 与代码 1 返回的结果,其中代码 2 返回结果全部可以再代码 1 中找到,

然后查看代码 1 返回的数据,抽出一条没有在代码 2 返回的结果,用如下代码进行查询

Shop.find("shop_id").recommend 结果返回为 1

很奇怪,求解答两个方法查询结果为什么有差别。

recommend 是不是设了默认值,但是没保存进数据库?

做了类型转换?

#2 楼 @ruby_sky 类型应该没问题的。否则第一行代码也不会查出来多的数据...

#1 楼 @Rei 这个查一下。嗯。

#1 楼 @Rei 检查了下。model 里写的是 field :recommend, type: Integer #shop recommend numble 没有填写默认值的。

#5 楼 @hging 那看看它数据库里面存的值是什么

#6 楼 @Rei 有部分数据,他在数据库里存的 recommend 值是 1,并且只有这一个值,但是通过代码 2 查不出来,代码 1 可以正常查出来

#6 楼 @Rei #2 楼 @ruby_sky 查了 mongo 数据库,发现是另外一套 java 的程序把这个 recommend 字段的类型变成了 string,导致部分数据该字段变为了 string,在查询的时候就出现问题。

#8 楼 @hging 所以还是类型的问题了。

#9 楼 @ruby_sky 嗯。但是代码 1 的类型应该也有问题。可是还是可以查出来。这点很让人费解的说。

#10 楼 @hging mongoid 我以前用的时候,好像是跟踪不到 query 语句的,如果你能 debug 到两个 Rails 查询语句在 Mongodb 中是如何执行的,应该就清楚了。

#10 楼 @hging 你或许需要 recommend === 1

#10 楼 @hging 你或许需要 recommend === 1

如果你设定了 recommend 类型是 Integer,那么可能读取属性的时候做了 to_i 的转换,'1' 就被转成 1 了。但是 mongodb 本身是无模式的,什么类型都可以存。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号