Как извлечь/фильтровать объекты массива в JSON с помощью RethinkDB

У меня есть простая структура JSON, например

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

Мне было интересно, как фильтровать данные json, которые имеют только b1 или b2. В этой документации [1] это было не очень ясно. Я попытался выполнить следующий запрос, но я уверен, что это неправильный способ сделать это.

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

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


person Rahul    schedule 13.04.2015    source источник


Ответы (1)


  1. Если вам нужны все строки со значением свойства b, которое имеет значение b1, вы можете просто использовать contains метод.

Для этого вы используете метод 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.

JavaScript

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

Питон:

r.db('test')
  .table('hello')
  .filter(lambda row: 
     row['b'].contains('b1') & row['b'].contains('b2') 
   )
  .run(conn)
  1. Если вам нужны все строки с массивом, который содержит только значения «b1» или «b2», вы можете использовать способ Даниэля и использовать .setDifference с методом isEmpty.

JavaScript

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

Питон:

r.db('test')
  .table('hello')
  .filter(lambda row: 
     row['b'].contains('b1') & row['b'].contains('b2') 
   )
  .run(conn)
person Jorge Silva    schedule 13.04.2015
comment
Обратите внимание, что если вы хотите иметь документы, содержащие только 'b1' или 'b2' в поле b, вы можете использовать set_difference в сочетании с is_empty следующим образом: ...table('business').filter( |row| row['b'].set_difference(['b1', 'b2'].is_empty())) Любой документ, где b содержит элементы, отличные от b1 и b2 будут отфильтрованы. - person Daniel Mewes; 14.04.2015
comment
Спасибо Даниэль. @ Хорхе Сильва, я был бы очень признателен, если бы вы также добавили эквивалент того же Python. Я пытался выполнить rql как запрос в python, я думаю, синтаксис и вызовы функций немного отличаются. - person Rahul; 15.04.2015
comment
Сделанный! Можете ли вы объяснить, что вы подразумеваете под немного другим синтаксисом и вызовами функций? Просто любопытно - person Jorge Silva; 15.04.2015