1

次のような「埋め込みの1対多」モデルがあります。

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

および次のようなクエリの「基準」:

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

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

元。:

%w[ruby web framework] のような配列の場合、次のすべての順列に一致する必要があります。

ruby web framework
ruby framework web

framework web ruby 
framework ruby web

web framework ruby
web ruby framework 

それは可能ですか?どうやってやるの ?

アップデート:

クエリはもう少し複雑でした(単純化しようとしていました)。ネストされた種類の抽出と順列は、私のソリューションでもセルジオ・トゥレンツェフのソリューションでも機能しません。どちらの場合も、正確な配列と一致するだけです。

  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

アップデート:

同じ ' 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
4

1 に答える 1

3

$all私はあなたがオペレーターを探していると思います

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

Mongoidで言えば、次のようになります。

User.all_in('watchlists.tags_array' => %w[ruby web framework])
于 2012-05-05T16:05:59.290 に答える