2015-11-18 2 views
0

У меня есть ниже в JSON RethinkDB таблицеФильтр вложенных полей в строках RethinkDB на основе нескольких значений

[{"pid": 0, 
    "sk": [ 
    { 
    "sid": 30, 
    "et": 3 
    }, 
    { 
    "sid": 22, 
    "et": 10 
    }, 
    { 
    "sid": 30, 
    "et": 10 
    } 
    ], 
"wc": [ 
    { 
    "wid": 29, 
    "et": 8 
    }, 
    { 
    "wid": 30, 
    "et": 2 
    }, 
], 
"dom": [ 
    { 
    "did": 7, 
    "et": 2 
    }, 
    { 
    "did": 6, 
    "et": 3 
    } 
], 
"ex": 17, 
"av": 12, 
"lc": "FRA" 
    } 

Как это есть несколько тысяч строк в таблице RethinkDB.

Моя цель заключается в поиске данных С.К., туалет

Например: Входной сигнал может быть

"СК": [{ "Sid": 21, "Et": 5}, {» sid ": 21," et ": 5}] После фильтрования при вышеуказанном условии результирующий набор данных снова должен быть отфильтрован для поля wc " wc ": [{" wid ": 1," et ": 7}, { «wid»: 4, «et»: 5}, {«wid»: 0, «et»: 7}]

Мне нужны выходные записи, которые содержались в данном входе , как в таблице, например , sk: [{sid: 2, et: 8}, {s id: 3, et: 6}, {sid: 3, et: 7}, {sid: 4, et: 9}] должны отображаться в выходном наборе данных, если поля ввода ниже [{sid: 3, et: 7}, {SID: 4, и др: 9}]

Я использовал ниже запроса, когда я {с.и.д.: ET} в одном наборе:

r.db('testdb').table('f_tab'). 
filter(
{ 
"sk": [{"0":"8"},{"1":"5"},{"8":"5"},{"3":"8"},{"12":"4"}] 
}).filter(
{ 
    "wc": [{"0":"7"},{"7":"9"},{"2":"6"},{"8":"4"},{"4":"7"}] 
}).getField('pid') 

Теперь я разделить значения SID и ЭТ для лучшее управление на стороне сервера код

Пробовал использовать r.row внутри фильтра, но он не работает Как я могу фильтровать на основе моего требования в python?

Каков наилучший подход для выполнения вложенных полей в этом режиме в перспективе производительности?

ответ

1

Это делает то, что вы хотите?

r.table('f_tab').filter(
    lambda row: r.expr([{'sid': 21, 'et': 5}, ...]).set_difference(row['sk']).is_empty() 
).filter(
    lambda row: r.expr([{'wid': 22, 'et': 6}, ...]).set_difference(row['wc']).is_empty() 
)['pid'] 
+0

Большое спасибо mlucy! Это работает. Я думаю, что lamba не отображается в Rethinkdb Data explorer. Но работает внутри моего кода на Python (Django) –

+0

Как проверить, что значение et больше или равно его значению? –

+0

Например: я хочу проверить таблицу, в которой есть все записи, имеющие (et ge 5) ->, если моя запись таблицы имеет {'sid': 21, 'et': 7} также должна быть возвращена вместе с { 'sid': 21, 'et': 5}, если он есть. Не могли бы вы помочь мне в том, как использовать внутреннее выражение ge для значений et. –