2011-07-26 18 views
4

私のモデルはUserとProjectです。各ユーザーは多くのプロジェクトに割り当てられ、各プロジェクトには多くのユーザーが割り当てられます。これは、多くの関係に多くの一般的であり、(source)として格納することができる:MongoDB(Mongoid)多対多の関係(追加フィールド)

# The user document. 
{ 
    "_id" : ObjectId("4d3ed089fb60ab534684b7e9"), 
    "project_ids" : [ ObjectId("4d3ed089fb60ab534684b7f2") ] 
} 

# The project document. 
{ 
    "_id" : ObjectId("4d3ed089fb60ab534684b7f2"), 
    "user_ids" : [ ObjectId("4d3ed089fb60ab534684b7e9") ] 
} 

問題は、私は、例えば、この関係を記述し、より多くのデータを割り当てたい、ありますユーザーがプロジェクト(管理者、マネージャーなど)に持つ役割。 RDBMSでは、ジョインテーブルに追加の列を追加するだけです。 MongoDBでは、これについてどうやって行くのか本当に分かりません。

ユーザーまたはプロジェクトに埋め込みドキュメントを追加する必要がありますか?私はこのようなことを考えていた:

# The project document. 
{ 
    "_id" : ObjectId("4d3ed089fb60ab534684b7f2"), 
    "assigned_users" : [ 
    { user_id: ObjectId("4d3ed089fb60ab534684b7e9"), role: "admin" }, 
    ... 
    ] 
} 

しかし、私はすべてのユーザーのプロジェクトを取得するためのクエリはかなり複雑になると思いますか?

私はMongoidを使用していますが、一般的な解決策に感謝します(そして、これをMongoidにマップする方法を理解します)。 また、データベースをRDBMSに変更できません。

答えて

3

Userについて知りたいことがあれば、Usersコレクションに保存するのはどうですか?

{ 
    "_id": ObjectID("..."), 
    "projects": [ 
    { "role": "admin", "project_id": ObjectId("...") }, 
    { "role": "manager", "project_id": ObjectId("...") } 
    ] 
} 

クエリはUsersコレクションで行われます。

// find all admins on a project, for example 
db.Users.find({ "projects" : 
        { "role" : "admin", "project_id": ObjectId("...") } }) 
+0

私はついに、割り当てられたユーザーをプロジェクトに入れるというアプローチをとった。あなたは、クエリが困難ではないが、私が実現するようにする例があります。私は 'db.projects.find({" assigned_users.user_id ":userId})'によってすべてのユーザプロジェクトをリストすることができます。 –

+0

うれしかった! – Pat

+0

@Juliusz Gonera、Mongoidで逆マッピングをどうやって作ったのですか?ユーザーが複数のプロジェクトに参加できる場合、おそらく 'project_id'の配列が必要ですが、Mongoidはそれをどのように保守するのか分かりません。 –