gorethink内部联接

时间:2016-05-08 17:00:15

标签: mysql sql join rethinkdb nosql

我根本不放弃了解联接,不幸的是,德国的文档很少。在我的特殊情况下,我也不太了解司机。

所以我有一个表'类别',我有两个文档:

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

我有第二个表'论坛',我有三个文档:

{"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中的大社区,因此如果你告诉SQL命令将如何,它也会对我有所帮助。

如果有一个与RethinkDB驱动程序相同的Go开发人员,也许你可以帮助找到Go的解决方案。因为我也不明白是如何将这个JavaScript代码(https://www.rethinkdb.com/api/javascript/#inner_join)翻译成Go,因为函数中的参数(marvelRow,dcRow)需要Go中的声明,但我不知道哪个。 / p>

我很高兴提示! 好处

2 个答案:

答案 0 :(得分:0)

让我们先用JavaScript编写,然后我们将在Go中进行编写,以便您知道下次如何操作。

你想要的东西很容易用连接或映射。但是,join将返回匹配文档的paird,而不是以您想要的嵌套方式返回。然而,我们可以这样映射:

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并开始一次转换JS一步。除了类型之外,它几乎是一对一的映射。

答案 1 :(得分:0)

SQL将是:

选择c.id作为cId, f.id如fid 来自类别c f.categoryId = c.id

上的内连接论坛f

注意:您可以从两个表中添加其他列。