0

作成しているアプリケーションでMongoidとMongoDBを使用しています。次のような1つのプロファイルを持つユーザーがいます。

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
  }
}

私は次のようにmapreduceを実行しています:

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 にはありません。クライアント アプリケーションで行うか、ドキュメントの埋め込みを検討することをお勧めします。ユーザーとプロファイルのコレクション。

ここで、設計変更がオプションでない場合は、2 つの mapReduce() を順番に実行できます。

  1. ユーザーにあるものですが、user_idをキーとして使用し、名前をフィールドとして追加します
  2. リーダーボード コレクションへのマージ出力を指定する、同じ user_id キーと vote_count を持つ Profile の mapReduce

これは役に立ちますか?

よろしく

ロナルド

于 2013-03-20T18:59:09.613 に答える