RethinkDB:​​如何从字典字段中获取数据并将其转换为列表

时间:2016-01-14 07:30:16

标签: rethinkdb

我的对象具有以下结构:

data

如何获得[10, ..., 100][15, ..., 150]<div>的不同列表来处理每个列表?

由于

3 个答案:

答案 0 :(得分:1)

如果所有data都有相同的密钥,我建议使用map-reduce进程。

.map(function(doc) {
  return doc('data').keys().map(function(key) {
     return [key, [doc('data')(key)]]
    }).coerceTo('object')  
})


.reduce(function(left, right) {
  return left.keys().map(function(key) {
      return [key, left(key).setUnion(right(key))]
    })
  .coerceTo('object')  
})   

根据您的数据集,我们有:

r.expr(
[
  {
    'record': 1,
    'tags': [1, 2],
    'data': {
      '1': 10,
      '2': 15
    }
  },

  {
    'record': 1,
    'tags': [1, 2],
    'data': {
      '1': 19,
      '2': 100
    }
  },


  {
    'record': 1,
    'tags': [3, 4, 5],
    'data': {
      '1': 100,
      '2': 150
    }
  }
]
)

.map(function(doc) {
  return doc('data').keys().map(function(key) {
     return [key, [doc('data')(key)]]
    }).coerceTo('object')  
})


.reduce(function(left, right) {
  return left.keys().map(function(key) {
      return [key, left(key).setUnion(right(key))]
    })
  .coerceTo('object')  
})   

产生:

{
    "1": [10, 19, 100],
    "2": [15, 100, 150]
}

答案 1 :(得分:0)

您可以在对象上调用values以从中获取值数组:https://www.rethinkdb.com/api/javascript/#values

如果并非所有索引都作为键存在,您可以编写类似r.range(obj.keys().max()).map(function(i) { return obj(i.coerceTo('string')).default(nil); })的内容。

答案 2 :(得分:0)

如果data字段可以是任何字符串,则可以使用以下内容:

r.db('test')
 .table('test')
 .getAll(1, {index: 'record'})
 .getField('data')
 .concatMap(r.row.coerceTo('array'))
 .group(r.row(0))
 .concatMap([r.row(1)])
 .ungroup()

否则,可能会使用mlucy的建议来提高效率。

编辑:在进一步的实验中,我无法让obj.keys()group更快。