0

我正在制作的应用程序中使用 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 reduce:

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);
  }
"

但是,我很难获取与用户关联的个人资料。有谁知道我如何从用户个人资料中提取数据?

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

托尼

4

1 回答 1

1

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

现在,如果不能选择更改设计,您可以按顺序执行两个 mapReduce():

  1. 您在用户上拥有的那个,但使用 user_id 作为键,并将名称添加为字段
  2. 具有相同 user_id 键和 vote_count 的 Profile 上的 mapReduce,将合并输出指定到您的排行榜集合中

这有帮助吗?

问候

罗纳德

于 2013-03-20T18:59:09.613 回答