Ваш вопрос не ясен для меня на 100%, поэтому я собираюсь переформулировать проблему, чтобы убедиться, что мое решение имеет смысл.
Проблема
Получить все документы, в которых свойство message
имеет тип object
или свойство message
является строкой и соответствует определенному регулярному выражению (используя match
).
Решение
В основном вам нужен оператор if
. Для этого вы можете использовать r.branch
для "разветвления" ваших условий в зависимости от этих вещей.
Вот очень длинный, но наглядный пример того, как это сделать:
Допустим, у вас есть эти документы, и вам нужны все документы, в которых свойство message
является объектом или строкой, содержащей подстроку «строка». Документы выглядят так:
{
"id": "a1a17705-e7b0-4c84-b9d5-8a51f4599eeb" ,
"message": "invalid"
}, {
"id": "efa3e26f-2083-4066-93ac-227697476f75" ,
"message": "this is a string"
}, {
"id": "80f55c96-1960-4c38-9810-a76aef60d678" ,
"not_messages": "hello"
}, {
"id": "d59d4e9b-f1dd-4d23-a3ef-f984c2361226" ,
"message": {
"exists": true ,
"text": "this is a string"
}
}
Для этого вы можете использовать следующий запрос:
r.table('messages')
.hasFields('message') // only get document with the `message` property
.filter(function (row) {
return r.branch( // Check if it's an object
row('message').typeOf().eq('OBJECT'), // return true if it's an object
true,
r.branch( // Check if it's a string
row('message').typeOf().eq('STRING'),
r.branch( // Only return true if the `message` property ...
row('message').match('string'), // has the substring `string`
true,
false // return `false` if it's a string but doesn't match our regex
),
false // return `false` if it's neither a string or an object
)
)
})
Опять же, этот запрос длинный и мог бы быть написан более элегантно, но он объясняет использование branch
очень четко.
Более короткий способ написания этого запроса таков:
r.table('messages')
.hasFields('message')
.filter(function (row) {
return
row('message').typeOf().eq('OBJECT')
.or(
row('message').typeOf().eq('STRING').and(row('message').match('string'))
)
})
В основном это использует and
и or
вместо branch
.
person
Jorge Silva
schedule
10.05.2015