2017-02-13 8 views
2

、私はそれが文書はカップルの方法で参加する実装することが可能だということを知っている:CouchDB 2.0 'Mango'を使用してドキュメント結合を実装できますか? CouchDBの1.6.1の前の仕事から

たとえば、「学生and 'coursesの簡単なスキーマを使用して:

// Students table 
| Student ID | Student Name 
| XYZ1  | Zach 

// Courses table 
| Course ID | Student ID 
| COURSE1 | XYZ1 

このSQLクエリ:

SELECT [Student Name], [Course ID] FROM Students RIGHT OUTER JOIN Courses ON Students.[Student ID] = Courses.[Student ID] 

は、マップ機能とのCouchDB 1.6で実施することができる:

// Map function 
function(doc){ 
    if (doc.type == 'Course') emit(doc["Student ID"], doc); 
    if (doc.type == 'Student') emit(doc["Student ID"], doc) 
} 

とグループおよび軽減機能

// Group would produce: 
Student ID: [{course doc}, {student doc}, {course doc}, etc] 

// Reduce would allow you to then process student and course docs for a single ID (with CouchDB protesting about expanding view indexes) 

それとも、どちらかのグループ化やグループ化されていないマップインデックスを反復処理するリスト機能を使用することができますどちらか。

マンゴーhereのドキュメントを見ると、_find(私は「マンゴーエンドポイント」と仮定しています)はインデックスを使用していると言います。

  1. あなたをすることができます

    質問...私は「フィールドが別のフィールドに等しい」を言うの道が表示されていないが、その後私はすべてのマンゴーに精通していませんよマンゴーでドキュメントの結合をエミュレートしますか?

  2. 可能であれば、これはMapReduceを使用して同じことを行うよりも優れているか悪いですか?

答えて

1

私はあなたがすでにそれを理解したと思っていますが、記録のために突き詰めます:等価セレクタを使用して、それらをOR演算子に入れることができます。

クエリはそのような見て何かをする必要があります:言われていること

{"studentId": "SOMEID" } 
{"$or": [{"type": {"$eq": "Student"}}, {"type": {"$eq": "Course"}}]} 

、あなたはCouchBbで生リレーショナルデータを操作しようとしているようです。私がいつも言っているように、あなたはCouchDbにリレーショナルデータをダンプするだけでは、幸せな生活を送ることはできません。リレーショナルデータをCouchDbに格納する前にリッチドメインオブジェクトに変換することを検討することをお勧めします。

+0

この場合、私のリレーショナルデータには一貫性のないスキーマがあります。たとえば、「Books」というエンティティがあり、10の異なる書店からのデータがあるとします。各本屋には本がある行がありますが、列の名前は異なります。私の意図は、すべての「本」をソファにこすりつけて、すべての書籍の行を単一のエンティティに「平らにする」ビューを作成することです。これについてあなたの意見は何ですか? –

+0

したがって、私が正しく理解している場合、 'Books'エンティティは最初はフラットではなく、通常のネストされた構造です。データをどのようにクエリするつもりですか?あなたはクエリ時に取得する書籍の種類を知っていますか? (基本的には、それを行う方法が複数あるので、達成しようとしていることを知る必要があります) – reddy

+0

私はこれがあなたのオリジナルの質問に直接関係しないかもしれないことを認識しています。ここで我々はそれについて議論するためのより多くのスペースとコンテキストを持っているので – reddy

関連する問題