如何使用RethinkDB在JSON中提取/过滤数组对象

时间:2015-04-13 17:34:32

标签: json rethinkdb reql

我有一个简单的JSON结构,例如

{'a' : 'value' , 'b': ['b1','b2','b3'] , c: 'value'} ,
{ 'a' : 'value' , 'b': ['b5','b6','b7'] , c: 'value'},
and so on . . .

我想知道如何过滤只有b1或b2的json数据。 在本文档[1]中并不是很清楚。我尝试运行以下查询,但我很确定,这不是正确的方法。

r.db('mine').table('business')
  .filter([{'categories':'Clothing'}])

[1] http://rethinkdb.com/docs/nested-fields/ruby/

1 个答案:

答案 0 :(得分:3)

  1. 如果您希望b属性中值为b1的所有行都可以使用contains方法。
  2. 使用contains方法(使用`filter方法)来执行此操作:

    r.db('mine')
     .tables('business')
     .filter(function (row) { return row('b').contains('b1'); })
     .run(conn)
    

    在Ruby中,看起来像这样:

    r.db('test')
     .table('hello')
     .filter{ |row| row['b'].contains('b1') }
     .run(conn)
    

    在Python中,看起来像这样:

    r.db('test')
     .table('hello')
     .filter(lambda row: row['b'].contains('b1'))
     .run(conn)
    
    1. 如果您希望b属性中值为b1且值为b2的所有行,您只需使用contains方法使用and方法。
    2. 的JavaScript

      r.db('mine')
       .tables('business')
       .filter(function (row) { 
         return row('b').contains('b1').and(row('b').contains('b2')); 
       })
       .run(conn);
      

      的Python:

      r.db('test')
        .table('hello')
        .filter(lambda row: 
           row['b'].contains('b1') & row['b'].contains('b2') 
         )
        .run(conn)
      
      1. 如果您希望所有行都包含一个仅包含值' b1'或者' b2',然后您可以使用Daniel的方式,并使用.setDifference方法和isEmpty方法。
      2. 的JavaScript

        r.db('mine')
         .tables('business')
         .filter(function (row) { 
           return row('b').contains('b1').and(row('b').contains('b2')); 
         })
         .run(conn);
        

        的Python:

        r.db('test')
          .table('hello')
          .filter(lambda row: 
             row['b'].contains('b1') & row['b'].contains('b2') 
           )
          .run(conn)