2012-05-05 58 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'的所有排列。

例:

在陣列狀的情況下

:%W [紅寶石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:

我只是想念,同樣的「all_in criteria」入內cicle太...和置換工作太細:

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 

回答

3

我認爲你正在尋找$all操作

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

Mongoid speak它應該是這樣的:

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

@ LucaG.Soave:對不起,什麼? –

+0

對不起,我沒有看到Mongoid說的版本... –

+0

它沒有在排列中工作,請參閱更新。 –