嵌入式一对多MongoID子文档中的全文搜索

时间:2012-01-21 10:13:12

标签: ruby-on-rails mongodb full-text-search mongoid nosql

我有一个MongoID用户模型

class User
  include Mongoid::Document
  field :name

  embeds_many :watchlists
end

嵌入one to many

class Watchlist
  include Mongoid::Document
  field :description

  embedded_in :user
end

我想将全文搜索到:description字段中,该字段位于User中嵌入的Watchlist子项中。最重的搜索通过1.5k描述,最多30个,每个40个单词。

这里的限制是,我将部署在Heroku上,而且他们目前还没有免费的索引计划。

然后我尝试使用mongoid_fulltext(以及mongoid_searchmongoid-searchable),但没有成功。

有人知道怎么做吗?

更新:

这是mongoid_fulltext的一个例子。用户模型嵌入了许多关注列表。我正在搜索一个字符串:description字段,它位于Watchlist子文档中:

class Watchlist
  include Mongoid::Document

  field :description
  ...

  embedded_in :user
end

监视列表嵌入在用户中:

class User
  include Mongoid::Document
  include Mongoid::FullTextSearch

  field :name
  ...

  embeds_many :watchlists

  def search_in_description
    self.watchlists.map{ |w| w.description }.join(' ')
  end
  fulltext_search_in :search_in_description
end

...但是以这种方式,运行User.fulltext_search("a presentation framework based on the power of CSS3")只返回导致匹配的父文档(用户实例)而不是监视列表doc(子实例)。

请参阅输出:http://pastie.org/3226179

如何获得匹配的“关注列表”? (我尝试了几种没有成功的方法)

1 个答案:

答案 0 :(得分:1)

在MongoDB中,您无法直接查询嵌入式文档。您可以按照您在示例中说明的方式查询以获取父文档,然后在返回的顶级文档用户上查询当前用户关注列表中所需的嵌入文档。

如果你经常这样做,也许你可能想考虑使用关系has_many而不是embeds_many。