加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – mongoid,如何将结果与map / reduce合并

发布时间:2020-12-17 03:38:30 所属栏目:百科 来源:网络整理
导读:我尝试使用reduce但我不知道如何调用输出. 例: @results = Article.collection.map_reduce(map,reduce,:out = 'test')@results.find() = Mongo::Cursor:0x2c276c4 namespace='myapp_development.test' @selector={} @cursor_id= 当我尝试: @results1 = Art
我尝试使用reduce但我不知道如何调用输出.
例:

@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,:out =>{reduce: 'test'}

预期结果是重复@results.但我运行@ results1.find().to_a我认为它与@results相同

如何使用mongoid在rubyrails中调用命名空间的结果?

解决方法

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

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

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

我想明确这一点:Key存储为_id,因此它在集合中是唯一的.

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

> replace(默认值):删除现有集合的内容,输出进入
> merge:保留现有的集合.当存在具有相同Key(_id)的结果时,将其替换为新映射/缩减的映射.
> reduce:保留现有的集合.当存在具有相同Key(_id)的结果时,MongoDB接受它,并获取新映射/缩减的一个,并对其中两个运行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")

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读