Mongoid标签 - 从模型中收集独特的数组项

时间:2015-04-21 17:52:28

标签: ruby-on-rails ruby mongodb mongoid

我使用Mongoid构建了一个Rails应用程序,我需要一个模型中的标签。

class Question
  include Mongoid::Document
  include Mongoid::Timestamps

  has_many :options
  belongs_to :user

  field :title, type: String
  field :options_count, type: Fixnum, default: 0
  field :tags, type: Array
end

效果很好,我可以使用any_in

获取所有问题标签
Question.any_in(tags:'foo')

但是如何从问题中的所有文档中获取所有标签?

我尝试使用map / reduce,但看起来我只是扫描所有文档并在Ruby中处理数组,它感觉不对。

map = %Q{
  function() {
    emit(this.title, {tags: this.tags});
  }
}

reduce = %Q{
  function(key, values) {
    var result = [];
    values.forEach(function(value) {
      result.push(value.tags);
    });
    return result.toString();
  }
}

map_reduce(map, reduce).out(inline: true).each do |doc|
  p doc['value']
end 

1 个答案:

答案 0 :(得分:1)

您可以使用db.collection.distinct。在你的情况下,使用Mongoid:

Question.distinct(:tags) 

这将返回所有文档中所有标记的数组,没有重复的值。