2016-05-08 7 views
0

私はジョイントを完全に理解していません。残念ながら、ドイツ語ではほとんどドキュメントがありません。私の特別なケースでは、私も実際にドライバーを理解していません。gorethink inner join

だから私は、テーブル「カテゴリ」を持っており、そこに私は2つのドキュメントしている:私は2番目のテーブル「フォーラム」を

{"id":1, "title":"Category 1"} 
{"id":2, "title":"Category 2"} 

を持っているよりも、そこに私は3つのドキュメントがあります

{"id":1, "title":"Forum 1", "categoryId":1} 
{"id":2, "title":"Forum 2", "categoryId":1} 
{"id":3, "title":"Forum 3", "categoryId":2} 

何を私は結果として望みます:

[{"id":1, "title":"Category 1", "forums":[{"id":1, "title":"Forum 1"},{"id":2, "title":"Forum 2"}]}, {"id":2, "title":"Category 2", "forums":[{"id":3, "title":"Forum 3"}]}] 

私は、RethinkDBが特にGo、therefoに大きなコミュニティを持っていないことを知っていますSQLコマンドをどのようにすればいいのかを教えてもらえると助かります。

RethinkDBドライバと共通するGoデベロッパーがいれば、Goで解決策を見つけるのに役立つかもしれません。なぜなら、関数の引数(marvelRow、dcRow)にはGoの宣言が必要なので、私はこのJavaScriptコード(https://www.rethinkdb.com/api/javascript/#inner_join)をGoに変換することができるからです。

非常に嬉しいです! ベネ

答えて

0

まずはJavaScriptで書いてみましょう。次にGoでやってみましょう。次回のやり方は分かります。

あなたが望むものは、結合またはマッピングで簡単に行うことができます。しかし、joinは、あなたが望むようにネストされた方法ではなく、matchドキュメントのペアを返します。しかし、次のようにマップすることができます:

r.table('categories') 
    .merge(function(cat) { 
    return { 
     forums: r.table('forums').filter({categoryId: cat('id')}).without('categoryId').coerceTo('array') 
    } 
    }) 

ここでGo langに移動しましょう。

package main 

import (
    r "github.com/dancannon/gorethink" 
    "log" 
) 

func main() { 

    s, _ := r.Connect(r.ConnectOpts{ 
     Address: "127.0.0.1:28015", 
     Database: "test", 
     MaxIdle: 10, 
     MaxOpen: 10, 
    }) 


    res, err := r.DB("test").Table("categories").Merge(func(doc r.Term) interface{} { 
     return map[string]interface{}{ 
      "forums": r.DB("test").Table("forums").Filter(map[string]interface{}{ 
       "categoryId": doc.Field("id"), 
      }).CoerceTo("array"), 
     } 
    }).Run(s) 

    log.Println(err) 

    var row interface{} 
    for res.Next(&row) { 
     log.Println(row) 
    } 
} 

Go langの場合を除き、すべてがほぼ同じですが、タイプを指定する必要があります。 JS anonoymous関数をGo lang無名関数に変換すると、ほとんどの場合、すべての型がr.Termになります。この場合はinterfaceを使用するので、戻り値の型も指定する必要があります。 JavaScriptオブジェクトはmap[string]interface{}になります。

一般に、このページのhttps://github.com/dancannon/gorethink/wiki/Go-ReQL-command-referenceにアクセスして、一度に1ステップずつJSの変換を開始しました。タイプを除いてほぼ1対1のマッピングです。

+0

"Go langの場合を除いて、すべてがほぼ同じですが、タイプを指定する必要があります。"あなたが言ったように、ほとんどの時間r.Termが使用されている、私は最も混乱して私は具体的なタイプに慣れています。とにかくあなたの素晴らしい答えをありがとう!今私は仕事を続けることができます、ありがとう! – Bene

+0

この結合の 'filter'はインデックスを利用しないので、テーブルが大きくなるにつれて非常に遅くなることに注意してください。 '.getAll(cat( 'id')、{index: 'categoryId'})' 'で' .filter({categoryId:cat( 'id')} ')を置き換え、' categoryId'フィールド。 は私が考えるゴアでのgetAllを使用する方法がわからない、しかし、ゴアは、ドキュメントはその上のいくつかの情報shouldhaveと思います。 (参加中の '.filter'コマンドがインデックスを使用し、したがって、大きなテーブルのための非常に遅いことができる。より良い使用するセカンダリインデックスと.getAll' instead'があるであろうことに留意されたいです。) –

0

SQLは次のようになります。CIDとして

選択c.id、インナー はf.categoryId = c.id

注F上のフォーラムに参加cのカテゴリからFID として f.id:あなたができます両方のテーブルから他のカラムを追加してください。