0

我正在通过带有 Rails 3 的 Mongoid 使用 MongoDB,并在进行查询时观察到这种奇怪的行为rails console

> Table.where(:field => {"$exists" => true}).count
=> 3735
> Table.where(:field => {"$exists" => true}, :field => {"$ne" => ""}).count
=> 14878 # wtf???
> Table.where(:field => {"$exists" => true}, :field => "").count
=> 0 # at least it's not negative
> Table.where(:field => {"$exists" => false}).count
=> 11143

因为11143 + 3735 = 14878,我假设这where(:field => {"$exists" => true}, :field => {"$ne" => ""})也计算那些:field不存在的记录(因为nil != ""?)。但是,我相信中列出的条件#where将与 连接and,因此它应该只匹配那些:field不存在空字符串 AND 的记录。

4

1 回答 1

1

您说“但是,我认为 #where 中列出的条件会与 'and' 相连”,但这是不正确的。条件是哈希,并且您在键:字段上有冲突。Ruby 默默地使用最后一个值。

请查看 Mongoid http://mongoid.org/en/origin/docs/selection.html中的选择文档,并使用#and 进行正确的“和”连接。请注意,您可以#inspect 查询并检查返回的 Criteria 对象。例如:

puts Table.where(:field => {"$exists" => true}, :field => {"$ne" => ""}).inspect

希望这会有所帮助。

于 2013-07-09T04:11:08.677 回答