Mongoid Map Reduce with has_one



我正在制作的应用程序中使用Mongoid和MongoDB。我有一个用户有一个这样的配置文件:

class User
 field :email, :type => String
 field :name, :type => String
 field :date_of_birth, :type => DateTime
 has_one :profile
end
class Profile
 field :votes, :type => Hash
 field :biography, :type => String
 belongs_to :profile
end

投票散列的结构如下:

profile : {
  "user_id" : ObjectId("511b76b0e80c505750000031"),
  "votes": {
    "vote_count": 3,
    "up_votes": 3,
    "down_votes": 0
  }
}

我正在运行这样的地图缩减:

map = "
  function () {
    values = {
      name: this.name
    }
    emit(this._id, values);
  }
"
reduce = "
  function (key, emits) {
    return emits;
  }
"
User.map_reduce(map, reduce).out(replace: "leaderboards").each do |document|
  ap document
end

这样做效果很好,并在Mongo中创建了一个名为排行榜的新集合。但是,我正在尝试映射概要文件中的一些数据,以便它包含概要文件中vote_count字段。

本质上使我的地图功能看起来像这样:

map = "
  function () {
    values = {
      name: this.name,
      votes: this.profile.votes.vote_count
    }
    emit(this._id, values);
  }
"

然而,我很难获取与用户相关的配置文件。有人知道我如何从用户档案中提取数据吗?

如果这里有什么不清楚的地方,请告诉我。如有任何帮助,我们将不胜感激。

Tony

在MongoDB中,无法在服务器端对来自不同集合的数据进行"联接"-必须在客户端应用程序中进行,或者更好地考虑文档嵌入,尤其是当用户和配置文件集合之间存在1:1的关系时。

现在,如果设计更改不是一个选项,您可以依次执行两个mapReduce():

  1. 在User上有一个,但使用User_id作为密钥,并添加名称作为一个字段
  2. 具有相同user_id密钥和vote_count,在排行榜中指定合并输出集合

这有帮助吗?

关于

罗纳德

相关内容

  • 没有找到相关文章