2012-03-22 16 views
3

モンゴイドany_ofに問題があります。私は1つのフィールド> 0、または他のいずれかを持っているオブジェクトを検索しようとしている> 0.私のクエリは次のとおりです。私はそれを理解したようモンゴイドまたは任意の予期しない動作

#<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> 

:それは中に「翻訳」され

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

これは私が欲しいものです。しかし、それは私に6つの結果を返します。 Model.where(:best_friends_lc_sum.gt => 0).countでも6件の結果が返ってきますが、Model.where(:lc_sum.gt => 0).countは〜850件の返品を返します。

私のクエリは、これらの2つの和集合を返すことを期待しています:モンゴイド/モンゴブのエラーですか、何か間違っていますか? FYI

:mongoid 2.4.5、MongoDBの2.0.2は、お時間を3.1.3

おかげレール!

+0

正しい属性をクエリしていますか? best_friend_methodとメソッドをクエリで使用しているようですが、あなたの基準はbest_friends_lc_sumとlc_sumです。 –

+0

はい、それが必要です。私は同じ属性セットを持っていますが、 'lc'の代わりに' lct'を使います。私の方法は、指定されたargsを検索し、それらの属性(lctのものかlcのもの)がクエリに使用されるかに応じて選択することになっています – ksol

+0

申し訳ありませんksol、 mongoidは正しいものですが、私はデータモデルとそのコレクションに含まれるものについて混乱しています。 mongoに対してクエリを直接実行すると、必要なものが得られますか? –

答えて

9

これは、argsを1つだけ渡し、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> 

はいつか{}の使用は、異なるハッシュを分離するために必須です。

+0

ニースコールシンガラ –

0

これが助けになる場合... Mongoid 3では、Origin宝石はクエリの構文を提供します。ここにはlist of methods that you can use to write your Mongoid 3 queriesがあります。これらの方法の中であなたが$orクエリを実行することができますor方法です:に渡されたハッシュの

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

少なくとも1:OPの元の例を使用して

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

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

が、それは次のように書き換えることができます。レコードが返されるためには、orメソッドが一致する必要があります。