Mongoid或/ any_of意外行为

时间:2012-03-22 09:26:16

标签: ruby-on-rails mongodb mongoid

我遇到了mongoid any_of的问题。我正在尝试找到具有一个字段>的对象。 0,或另一个>我的查询是:

Model.any_of(best_friend_method.gt => 0, method.gt => 0).desc(best_friend_method, method)

它被“翻译”在:

#<Mongoid::Criteria
  selector: {"$or"=>[{:best_friends_lc_sum=>{"$gt"=>0}, :lc_sum=>{"$gt"=>0}}]},
  options:  {:sort=>[[:best_friends_lc_sum, :desc], [:lc_sum, :desc]]},
  class:    FbAlbum,
  embedded: false>

据我了解,这就是我想要的。但它只给我6个结果。 Model.where(:best_friends_lc_sum.gt => 0).count也会返回6个结果,但是Model.where(:lc_sum.gt => 0).count会返回~~ 850个对象。

我希望我的查询返回那两个的联合:是一个mongoid / mongodb错误,还是我做错了什么?

仅供参考:mongoid 2.4.5,mongodb 2.0.2,rails 3.1.3

谢谢你的时间!

2 个答案:

答案 0 :(得分:9)

这是因为你只通过一个args而不是2个args。所以就像你没有使用$or一样。

尝试:

Model.any_of({best_friend_method.gt => 0}, {method.gt => 0}).desc(best_friend_method, method)

在这种情况下,标准成为:

#<Mongoid::Criteria
  selector: {"$or"=>[{:best_friends_lc_sum=>{"$gt"=>0}}, {:lc_sum=>{"$gt"=>0}}]},
  options:  {:sort=>[[:best_friends_lc_sum, :desc], [:lc_sum, :desc]]},
  class:    FbAlbum,
  embedded: false>

有时必须使用{}来分隔不同的哈希值。

答案 1 :(得分:0)

如果这有助于某人...在Mongoid 3中,Origin gem提供了查询的语法。这是list of methods that you can use to write your Mongoid 3 queries。在这些方法中,or方法允许您执行$or查询:

# Mongoid query:
Model.or(
  { name: "Martin" }, { name: "Dave" }
)

# resulting MongoDB query:
{
  "$or" => [
    { "name" => "Martin" }, { "name" => "Dave" }
  ]
}

使用OP的原始示例,可以将其重写为:

Model.or(
  { best_friend_method.gt => 0 },
  { method.gt => 0 }
).order_by(
  best_friend_method,
  method
)

传递给or方法的哈希中至少有一个必须匹配才能返回记录。

相关问题