我有一个“embedded one to many”模型,如下所示:
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 [ruby web framework],我需要匹配以下所有排列:
ruby web framework
ruby framework web
framework web ruby
framework ruby web
web framework ruby
web ruby framework
这可能吗?我怎么能这样做?
更新:
查询有点复杂(我试图简化),它是一种嵌套的提取和排列不适用于我的解决方案或Sergio 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
更新:
我只是想念,同样的'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
答案 0 :(得分:3)
我认为您正在寻找$all
运营商
db.users.find({'watchlists.tags_array': { $all: ['ruby', 'web', 'framework']}});
在Mongoid speak中应该是这样的:
User.all_in('watchlists.tags_array' => %w[ruby web framework])