数组元素的排列,作为MongoID查询中的查询条件

时间:2012-05-05 15:57:32

标签: ruby-on-rails ruby mongodb mongoid

我有一个“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

1 个答案:

答案 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])