重新思考合并数组

Rethink merge array

我有一个问题 -

 r.table('orgs')
        .filter(function(org) {
            return r.expr(['89a26384-8fe0-11e8-9eb6-529269fb1459', '89a26910-8fe0-11e8-9eb6-529269fb1459'])
            .contains(org('id'));
        })
        .pluck("users")

这 returns 以下输出 -

{
"users": [
"3a415919-f50b-4e15-b3e6-719a2a6b26a7"
]
} {
"users": [
"d8c4aa0a-8df6-4d47-8b0e-814a793f69e2"
]
}

如何得到结果 -

[
 "3a415919-f50b-4e15-b3e6-719a2a6b26a7","d8c4aa0a-8df6-4d47-8b0e-814a793f69e2"
]

首先,不要直接在 table 上使用那个复杂且耗费资源的 .filter。由于您测试的字段已经编入索引 (id),您可以:

r.table('orgs').getAll('89...59', '89...59')

r.table('orgs').getAll(r.args(['89...59', '89...59']))

速度更快(方式!)。我最近发现 this article 速度有多快。

现在要使用 brackets 操作获取 users 的数组而不换行:

r.table('orgs').getAll(...).pluck('users')('users')

将提供类似

的结果
[
  '123',
  '456'
],
[
  '123',
  '789'
]

我们刚刚删除了 "users" 包装,但结果是一个数组数组。让我们用 .concatMap:

展平这个二维数组
r.table('orgs').getAll(...).pluck('users')('users').concatMap(function (usrs) {
  return usrs;
})

现在我们已将子数组连接成一个,但是我们看到了重复项(从我之前的结果示例中,您有两次 '123')。只是 .distinct 事情:

r.table('orgs').getAll(...).pluck('users')('users').concatMap(function (usrs) {
  return usrs;
}).distinct()

根据我举的例子,你现在有:

'123',
'456',
'789'

瞧瞧!