重新考虑合并数组

时间:2018-08-09 11:13:12

标签: rethinkdb array-merge reql

我有一个查询-

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

这将返回以下输出-

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

如何获得结果--

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

1 个答案:

答案 0 :(得分:3)

首先,不要直接在表上使用复杂而耗资源的.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'

等等!