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

Mongoid Tags - Gather unique array items from model

我正在使用 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 

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

Question.distinct(:tags) 

这将 return 所有文档中所有标签的数组,没有重复值。