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']}});
を探しているのだと思い
@ LucaG.Soave:どうしたのですか? –
申し訳ありませんモンゴイドがバージョンを話すのを見ませんでした... –
それは順列で働きません、UPDATEを見てください。 –