我在Mongoid中使用MongoDB和Rails 3并在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
不为空字符串并且存在的记录。
答案 0 :(得分:1)
你说“但是,我相信#where中列出的条件会加上'和',”但这不正确。条件是哈希值,您在key:字段上发生冲突。 Ruby默默地使用最后一个值。
请查看文档以便在Mongoid http://mongoid.org/en/origin/docs/selection.html中进行选择,并使用#and进行正确的'和'结合。请注意,您可以#inspect您的查询并检查返回的Criteria对象。例如:
puts Table.where(:field => {"$exists" => true}, :field => {"$ne" => ""}).inspect
希望这会有所帮助。