RethinkDB表连接

时间:2014-09-30 12:53:50

标签: json join rethinkdb

我有两个表,一个用于主机,一个用于用户。

主机:

{
        "host": "server1",
        "address": "192.168.1.22", 'users': ["Magneto", "Professor Xavier", "Storm"]
    },
    {
        "host": "server2",
        "address": "192.168.1.23", 'users': ["Storm"]
    },
    {
        "host": "server3",
        "address": "192.168.1.24", 'users': ["Magneto", "Storm"]
    }

用户:

{
        "hero": "Magneto",
        "name": "Max Eisenhardt",
        "aka": ["Magnus", "Erik Lehnsherr", "Lehnsherr"],
        "magazine_titles": ["Alpha Flight", "Avengers", "Avengers West Coast"]
    },
    {
        "hero": "Professor Xavier",
        "name": "Charles Francis Xavier",
        "magazine_titles": ["Alpha Flight", "Avengers", "Bishop", "Defenders"]
    },
    {
        "hero": "Storm",
        "name": "Ororo Monroe",
        "magazine_titles": ["Amazing Spider-Man vs. Wolverine", "Excalibur",
            "Fantastic Four", "Iron Fist"]
    }

我尝试从主机创建连接查询,以使用户最终为每个服务器获取此类内容。基本上将用户数据组合到服务器文档中。 e.g。

 {
"host": "server3",
"address": "192.168.1.24",
"users": [
    {
        "hero": "Storm",
        "name": "Ororo Monroe",
        "magazine_titles": [
            "Amazing Spider-Man vs. Wolverine",
            "Excalibur",
            "Fantastic Four",
            "Iron Fist"
        ]
    },
    {
        "hero": "Magneto",
        "name": "Max Eisenhardt",
        "aka": [
            "Magnus",
            "Erik Lehnsherr",
            "Lehnsherr"
        ],
        "magazine_titles": [
            "Alpha Flight",
            "Avengers",
            "Avengers West Coast"
        ]
    }
]
}

由于用户包含在服务器"用户"数组,我无法理解我应该如何在这里执行查询?

这是我尝试过的但到目前为止没有运气:

r.db('data').table("hosts")
 .concatMap(function (x) {
   return x("users").map(function (usr) {
   return x.merge({users: usr});
 });
}).eqJoin("users", r.db('data').table("users"))

1 个答案:

答案 0 :(得分:1)

首先在hero上创建索引

 r.db('data').table('users').indexCreate("hero")

 r.db('data').table("hosts").merge(function(host) {
     return {
         users: r.table("users").getAll(r.args(host("users")), {index: "hero"}).coerceTo("ARRAY")
     }
 })

如果数组users可能为空,则需要添加带r.branch的if语句

 r.db('data').table("hosts").merge(function(host) {
     return r.branch(
         host("users").isEmpty(),
         {},
         {
              users: r.table("users").getAll(r.args(host("users")), {index: "hero"}).coerceTo("ARRAY")
         }
     )
 })