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

hging · 发布于 2014年06月18日 · 最后由 Rei 回复于 2014年06月20日 · 1099 次阅读
11562

首先给出两行查询代码: 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

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

共收到 14 条回复
1

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

273

做了类型转换?

11562

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

11562

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

11562

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

1

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

11562

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

11562

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

273

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

11562

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

273

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

8972

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

8972

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

1

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

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