【问题标题】:mongoid, how to merge result with map/reducemongoid,如何将结果与 map/reduce 合并
【发布时间】:2012-06-10 17:56:43
【问题描述】:

我尝试使用 out reduce 但我不知道如何调用 output 。 示例:

@results = Article.collection.map_reduce(map, reduce, :out => 'test')

@results.find()
 => <Mongo::Cursor:0x2c276c4 namespace='myapp_development.test' @selector={} @cursor_id=> 

当我尝试时:

@results1 = Article.collection.map_reduce(map, reduce, :out =>{reduce: 'test'}

预期结果是重复的@results。但是我运行@results1.find().to_a 我看到它与@results 相等

以及如何使用 mongoid 在 ruby​​rails 中按名称空间调用结果??

【问题讨论】:

  • 试试@results.to_a。这是什么?
  • @sergio:我的问题是如何调用收集结果 'test' 。以及使用输出“减少”的方式。谢谢回复:)

标签: ruby-on-rails ruby-on-rails-3 mongoid


【解决方案1】:

TLTR:你不能有重复的结果。

当 map 函数发出一些东西,而 reduce 函数返回一些东西时,它是一对 [key, value]。 当存储到集合中时,对于每个条目,输出都表示为 Mongoid 文档,如下所示:

{
  "_id" => "my key",
  "value" => "my value"
}

我想明确一点:密钥存储为_id,因此它在集合中是唯一的。

查看Map/Reduce output options 了解 MongoDb 在输出到现有集合时如何处理重复键:

  • 替换(默认):现有集合的内容被丢弃,输出进入其中

  • merge : 保留现有集合。当存在具有相同 Key(_id)的结果时,它会被新的 map/reduced 替换。

  • reduce : 保留现有集合。当存在具有相同 Key(_id)的结果时,MongoDB 会获取它,并获取新的 map/reduce 的结果,并对它们两者运行 reduce 函数,并存储结果。

所以,你不能有重复的结果。

编辑:

我在这里回复“你能告诉我如何应用输出减少,以及如何调用收集结果”(因为响应很长):

有很多方法。让我们举一个例子:

class Post
  include Mongoid::Document
  include Mongoid::Timestamps

  field :tags, :type => Array
end

Post.create(:tags => ["Dog", "Cat"])
Post.create(:tags => ["Dog", "Puppy"])

让我们映射/减少这个:

map = %Q{
  function() {
    this.tags.forEach(function(tag){
      emit(tag, { count: 1 });
    }); 
  }
}

reduce = %Q{
  function(key, values) {
    var result = { count: 0 };
    values.forEach(function(value) {
      result.count += value.count;
    });
    return result;
  }
}

Post.map_reduce(map, reduce).out(replace: "tags")

好的,将结果放入名为“tags”的集合中覆盖它。

我们可以创建一个模型来访问它:

class Tag
  include Mongoid::Document

  field :value, :type => Hash
end

dog = Tag.find("Dog")
dog._id # => "Dog"
dog.value["count"] # => 2

为了好玩,假设您保留上次执行 map/reduce 的时间戳。您可以使用reduce 逐步进行:

Post.where(:created_at.gt => Time.at(my_timestamp)).map_reduce(map, reduce).out(reduce: "tags")

** 编辑:固定地图功能**

【讨论】:

  • 你能告诉我如何应用输出减少,以及如何调用收集结果。例如: <:cursor:0x2c276c4 namespace="myapp_development.test"> 我尝试在控制台中运行:myapp_development.test => undefined myapp_development db.test => undefined db .... 谢谢:D
  • 我在回复里直接回答了(cmets太刁钻了)。
  • 啊,为什么我使用 .map_reduce(map, reduce).out(reduce: "tags") 我收到一个错误 Mongo::OperationFailure: Database command 'mapreduce' failed: (assertion: '' out' 必须是字符串或对象'; assertionCode: '13606'; errmsg: 'db assertion failure'; ok: '0.0') 我使用 mongoid ver 2.4.11 和 mongo 1.6.2
  • 啊,我举了一个Mongoid 3的例子。对于2.4,它是MyModel.collection.map_reduce(map, reduce, options)。此函数是传递驱动程序map_reduce 函数。您可以在api.mongodb.org/ruby/current/Mongo/…中找到选项
猜你喜欢
  • 2023-03-23
  • 1970-01-01
  • 2017-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-29
  • 1970-01-01
相关资源
最近更新 更多