2012-05-05 10 views
1

をクエリとして、私は次のように「embedded one to many」モデルを持っている:順列、MongoIDでクエリ条件が

次のように照会するため
class User 
    include Mongoid::Document 

    field :nickname 
    embeds_many :watchlists 
end 

class Watchlist 
include Mongoid::Document 

field :html_url 
field :description 
field :tags_array, type: Array 
embedded_in :user 
end 

と「criteria」:

User.where('watchlists.tags_array' => %w[ruby web framework]) 

問題は 'watchlists.tags_array'が提示する単語の「正確な」シーケンスと一致しますが、 'ruby'、 'web'、 'framework'のすべての順列に一致させたいのです。

例:配列の場合

のように:[ルビーのWebフレームワーク]ワット%、私は以下のすべての順列に一致する必要があります。

ruby web framework 
ruby framework web 

framework web ruby 
framework ruby web 

web framework ruby 
web ruby framework 

が可能ということですか?どうやってやるの ?

UPDATE:

クエリは(私はsemplifyしようとしていた)少し複雑だった、それは抽出および順列のネストされたようなものは、私の解決策もセルジオTulentsevとの溶液のいずれかで動作しません。それはちょうど、両方のケースで正確な配列を一致:

Object.const_set :Competitor, Struct.new(:html_url, :description, :watchers, :forks) 
    def self.find_competitors(tags_array) 
    competitors = [] 
    # doesn't work: User.where('watchlists.tags_array' => tags_array).only(:watchlists).each do |u| 
    User.all_in('watchlists.tags_array' => tags_array).only(:watchlists).each do |u| 
     u.watchlists.where(:tags_array => tags_array).each do |wl| 
     competitors << Competitor.new(wl.html_url, wl.description, wl.watchers, wl.forks) 
     end 
    end 
    return competitors 
    end 

UPDATE:

は、私はあまりにも、インナーcicleに「all_in criteria」同じことを欠場...と順列はあまりにも正常に動作します:

User.all_in('watchlists.tags_array' => tags_array).only(:watchlists).each do |u| 
    u.watchlists.all_in(:tags_array => tags_array).each do |wl| 
    competitors << Competitor.new(wl.html_url, wl.description, wl.watchers, wl.forks) 
    end 
end 
私はあなたが $allオペレータで

db.users.find({'watchlists.tags_array': { $all: ['ruby', 'web', 'framework']}}); 

を探しているのだと思い

答えて

3

Mongoid speakこれは次のようになります。

User.all_in('watchlists.tags_array' => %w[ruby web framework]) 
+0

@ LucaG.Soave:どうしたのですか? –

+0

申し訳ありませんモンゴイドがバージョンを話すのを見ませんでした... –

+0

それは順列で働きません、UPDATEを見てください。 –