如何获取 RethinkDB table 中所有文档的所有键的列表?

How to get a list of all keys across all documents in a RethinkDB table?

我有一个动态填充的 table,其中文档可以具有事先不知道的不同键:

文档 1

{
 'attribute1': 'foo',
 'attribute2': 'bar'
}

文档 2

{
 'attribute1': 'foo',
 'attribute3': 'baz'
}

如何获取所有文档中存在的所有属性的列表?

attribute1
attribute2
attribute3

我试过按 keys() 分组,但我得到的是可能的属性组合列表,而不是单个键。

它会很慢,但是你可以这样写table.concatMap(function(row) { return row.keys(); }).distinct()

我不确定是否有比 O(n) (?) 更有效的解决方案,除非您通过每次数据更新来更新一些自定义元数据,但无论如何,我想我会去

  table.reduce(function(left, right) {
    return left.merge(right)
  }).keys()

虽然如果您有很多文档,这速度不够快,但它最终会完成并且不会消耗大量内存:

r.table('table')
  .map(r.row.keys())
  .reduce(function(left, right) {
    return left.setUnion(right)
  })

您可以简单地创建一个 multi 类型的二级索引:

r.table('foo').indexCreate('all_keys', function(d){
  return d.without('id').keys()
}, {multi: true})

要获得所有钥匙,只需 运行:

r.table('foo').distinct({index: 'all_keys'})

瞧 ;-)