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 

那可能吗 ?我怎样才能做到这一点 ?

更新:

查询有点复杂(我试图简化),它是一种嵌套的提取和排列,不适用于我的解决方案,也不适用于 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 标准”也进入内部循环......并且排列也很好:

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 回答