2011-12-15 16 views
1

これは私のコレクションである:(多対多)MongoDBの多対多の検索

俳優:

{ 
_id: 1, 
name: "Name 1" 
} 

映画:

{ 
    _id: 1, 
    name: "The Terminator", 
    production_year: 1984, 
    actors: [ 
      { 
       actors_id: 1, 
       role_id : 1 
      }, 
      { 
      actors_id: 2, 
      role_id : 1 
      } 
      ] 
} 

私は得ることができませんいくつかの映画の俳優のリスト

これを持っていると問題はありません:

{ 
    _id: 1, 
    name: "The Terminator", 
    production_year: 1984, 
    actors: [1,2,3,4,5] (actors id's) 
} 

var a = db.movies.findOne(name:"The Terminator").actors 
db.actors.find({"_id":{$in:a}}) 

しかし、どのように私はこのような構造でそれを行うことができます。

[ 
{ 
    actors_id: 1, 
    role_id : 1 
}, 
{ 
    actors_id: 2, 
    role_id : 1 
} 
] 

は、どのように私はこれだけでは得るか:私はこのvar a = db.movies.findOne(name:"The Terminator").actors

を行い、場合

それはこの私を返します。アクターの名前を取得するための配列[1,2](actors_id)

ありがとう、 Zoran

答えて

2

あなたにはありません。 MongoDB内では、常にドキュメントを照会するので、スキーマが特定のドキュメントを照会することによって必要なすべての情報を得ることができるようにする必要があります。 MongoDBには、join/viewのような機能はありません。

通常、このような場合は非正規化が最も適切です。スキーマは、従来のリレーショナルデータベース用に設計されているように見えます。したがって、リレーショナルデータに付属するスキーマ設計原則のいくつかを試してみる必要があります。

具体的には、たとえば、映画のクエリを実行した後にその情報を持つように、俳優名を埋め込み配列に追加することができます。

最後に、必要な作業に適切なツールを使用しているかどうかを検討してください。あまりにも頻繁に人々はMongoDBは完全に間違っている "高速MySQL"と考えています。ドキュメントデータベースは、RDBMSやk/vストアとは非常に異なります。関連するデータが多い場合は、RDBMSを使用してください。

+0

私はそれをあなたの答えRemonに感謝します。埋め込み配列にIDの代わりに名前を付けると、アクター名を更新したいのであれば、別のコレクションで変更してIDで参照する代わりに、すべてのムービーを読み込んで変更する必要があります。 – zugrina

+1

はい、まさにその意味です。このアップデートは、すべてのムービーで1つのアトミックな書き込みを非常に簡単に行うことができますが、実行時間の点では重量のある操作になる可能性があります。これは、正しいツールを使用しているかどうかを実際に検討する必要があると述べた理由です。この場合、あなたが尋ねなければならない質問は、「どのくらいの頻度で俳優が名前を変えますか?」です。答えはめったにないので、数日/週に1回更新を実行する必要はありません –

0

db.movies.findOne(name:"The Terminator").actorsにおける変数aは、文書の配列ですので、あなたはそれを整数(IDS)の配列を作る必要があるだろう

関連する問題