2016-03-04 1 views
0

Я сохранил данные JSON в таблице. Я хочу получить данные на основе userId, userId является свойством объекта Users.Как искать данные JSON в mysql, используя регулярное выражение в Strongloop

Пример: Я хочу, чтобы извлечь все записи, если пользователи содержат 513

Мой образец таблицы данных:

Table name:share 

Id name   sharedusers 
1 xxxx   {"accessType":0,"permission":"1","specificUsers": 
        [{"users":"502,512,513","permission":"1"}]} 

2 yyy    {"accessType":0,"permission":"1","specificUsers": 
        [{"users":"47,52,60","permission":"1"}]} 

3 zzzz   {"accessType":0,"permission":"1","specificUsers": 
        [{"users":"502,512,513","permission":"1"}]} 

Я попробовал следующий запрос в находке() метод, но не рабочий, его с указанием ошибки ..

{"where": {"sharedusers": {"regexp": "/"users":"[^"]*\b513\b/"}}} 

{"where": {"sharedusers": {"regexp": /"users":"[^"]*\b513\b/ 
}}} 
{"where": {"sharedusers": /"users":"[^"]*\b513\b/} } 

{"where": {"sharedusers": "/"users":"[^"]*\b513\b/"} } 

and also i tried restcall 

filter[where][share][regexp]=/"users":"[^"]*\b513\b/ 

В MySql Я пробовал следующий код, его рабочий режим Но я не знаю , как сделать то же самое в strongloop.

SELECT * FROM share where sharedusers REGEXP '"users":"[^"]*[[:<:]]513[[:>:]]'; 

Мое определение модели:

{ 
    "name": "share", 
    "base": "PersistedModel", 
    "idInjection": true, 
    "options": { 
    "validateUpsert": true 
    }, 
    "properties": { 
    "name": { 
     "type": "string" 
    }, 
    "sharedusers": { 
     "type": "string" 
    } 
    }, 
    "validations": [], 
    "relations": {}, 
    "acls": [], 
    "methods": {} 
} 

версия Mysql: '5.6.27-журнал'

+0

Вы должны знать, что этот запрос вряд ли будет быстрым. Это почти наверняка потребует сканирование таблицы и, следовательно, будет линейным в количестве строк в вашей таблице. –

+0

@ChrisKitching Я принимаю ваш комментарий, но у нас есть только лимит записей. –

ответ

0

Strongloop делает некоторую работу для вас в подполей, когда тип данных, если объект, это приводит к некоторые интуитивно понятные запросы, например, в вашей ситуации (но очень интуитивно понятные, когда вы привыкли к стилю запросов MongoDB/Postgres)

Вы должны использовать

{"where": {"sharedusers.users": {"regexp": "[^\"]*[[:<:]]513[[:>:]]" }}} 

Из того, что я понимаю из вашего запроса, регулярное выражение не соответствует:

{"where": {"sharedusers.users": "/(513,|,513,|513$)/" }} 

Вы можете изменить хранилище базы данных, чтобы иметь users как массив строк: если вы используете MySQL с помощью JSON поддержка (https://dev.mysql.com/doc/refman/5.7/en/json.html), было бы гораздо быстрее, и вы можете сделать следующее:

{"where": {"sharedusers.users": "513" }} 

было бы намного быстрее

Редактировать: после нескольких комментариев и обновления вопросов мой ответ недействителен, потому что вы используете тип данных String для поля sharedusers.

+0

Я пробовал этот {"где": {"sharedusers.users": {"regexp": "[^ \"] * [[: <:]]513[[:>:]] "}}}, но я получаю пустой массив. –

+0

Это потому что ваше регулярное выражение не совпадает, попробуйте '' '/ (513, |, 513, | 513 $) /' '' –

+0

Я попытался использовать память и mysql. mysql return error "unknown column". memory storage return empty array. можете ли вы предоставить пример приложения? –

Смежные вопросы