我有两个表,一个用于主机,一个用于用户。
主机:
{
"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"))
答案 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")
}
)
})