python - 根据嵌套对象的某些元素过滤 Rethinkdb 表

标签 python json nested rethinkdb

我很难理解如何使用 Python 根据以下数据的嵌套元素上的子字符串匹配来过滤我的 rethinkdb 表:

{
// HERE WE HAVE MANY RECORDS
    "record":  "0a76d012-f83d-4bd3-95b7-2ba973750bde" ,
    "steps": 
    [ 
// HERE WE HAVE MANY STEPS
        {
            "step": 1,
            "latest_db_info": { ... } ,
            "data": 
            [
               {
                    "hash":  "2ba7e669" ,
                    "name":  "Numero de l'extrait" ,
                    "position": 1 ,
                    "value":  "Limoges_34"
                } ,
                {
                    "hash":  "d094874e" ,
                    "name":  "Numero de page de l'extrait" ,
                    "position": 2 ,
                    "value":  "Limoges_p. 34"
                } ,
                {
                    "hash":  "598653a6" ,
                    "name":  "Type de l'extrait" ,
                    "position": 3 ,
                    "value":  "texte"
                }
            ]
        }
    ]
}

例如,我想要的是获取具有以下内容的所有记录:

  • 与字段“value”匹配“mog”的子字符串
  • 同时匹配“名称”字段的“页码”

例如,字段“value”的路径类似于:

{'steps': [{'data': [['value' ...

我尝试在lambda函数上进行直接过滤,但没有给出任何结果。 我通过 concat_map 得到了一些结果:

r.table('mytable') \
    .concat_map(r.row['steps']) \
    .concat_map(r.row['data']) \
    .filter(
        lambda row: row['value'].match('mog')
    ).run()

但是结果丢失了原始的记录字段...

[{'position': 1, 'hash': '2ba7e669', 'value': 'Limoges_34', 'name': "Numero de l'extrait"}, 
[...]

有人可以引导我走向正确的方向吗? 另外,一个 JavaScript 示例也会有所帮助。

编辑:接受的答案有效,感谢@kureikain。这是供将来引用的 python 版本:

r.table('mytable') \
    .concat_map(
        lambda doc: doc['steps'] \
            .concat_map(lambda step: step['data'] \
                .concat_map(lambda data: [{'record': doc['record'], 'step': data}]
    ))) \
  .filter(
    lambda doc: 
        doc['step']['value'].match('mog').and_(doc['step']['name'].match('Numero de page'))
  ).run()

最佳答案

使用嵌套语法的过滤器仅适用于嵌套对象,我们没有办法使用嵌套语法选择/查询数组。

如果您想包含与您的值匹配的record字段和step/data记录,您可以使用如下内容:

r.table('mytable')
  .concatMap(function(doc) {
    return doc('steps')
      .concatMap(function(step) {
        return step('data').concatMap(function(data) {
          return [{record: doc('record'), step: data}]
        })
      })
  })

  .filter(function(doc) {
    return doc('step')('value').eq('mog').and(doc('step')('name').eq('Numero de page'))
  })

或者另一种方式,不使用过滤器

r.table('mytable')
  .concatMap(function(doc) {
    return doc('steps')
      .concatMap(function(step) {
        return step('data').concatMap(function(data) {
          return
            r.branch(data('value').eq('Limoges_34').and(data('name').eq('Numero de l\'extrait')),
              [{record: doc('record'), step: data}],
              [])
        })
      })
  })

关于python - 根据嵌套对象的某些元素过滤 Rethinkdb 表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34645516/

相关文章:

python - 无法从 PyYAML 调用的构造函数中的参数构造对象

mysql - 从 mysql 5.7 中的 json 数组中提取键

json - Play Framework - 向 JSON 对象添加字段

ruby-on-rails - 在 rails 中将字符串转换为数组

C++:如何在声明它的模板类主体之外定义枚举类?

c++ - 如何在代码中读取嵌套结构?

java - 实例化静态嵌套类而不限定封闭类

python - 用于机器学习部分的 OpenCV 2.2 python 绑定(bind)

Python 在函数内使用 For 循环

python - 有效地创建具有增量值的新列