Как искать данные JSON в mysql, используя регулярное выражение в Strongloop

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

Пример: я хочу получить все записи, если пользователи содержат 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"}]} 

Я попытался выполнить следующий запрос в методе find (), но не работает, показывает ошибку.

{"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-log»


person Riaz as kather    schedule 04.03.2016    source источник
comment
Вы должны знать, что этот запрос вряд ли будет быстрым. Это почти наверняка потребует сканирования таблицы и, следовательно, будет линейным по количеству строк в вашей таблице.   -  person Chris Kitching    schedule 04.03.2016
comment
@ChrisKitching Я принимаю ваш комментарий, но у нас есть только лимит записей.   -  person Riaz as kather    schedule 04.03.2016


Ответы (1)


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.

person Jonathan Muller    schedule 05.03.2016
comment
Я пробовал это, {где: {sharedusers.users: {regexp: [^\]*[[:‹:]]513[[:›:]] }}}, но получаю пустой массив. - person Riaz as kather; 05.03.2016
comment
Это потому, что ваше регулярное выражение не совпадает, попробуйте /(513,|,513,|513$)/ - person Jonathan Muller; 05.03.2016
comment
Я пробовал хранилище памяти и mysql. MySQL возвращает столбец errorunknown. хранилище памяти возвращает пустой массив. Можете ли вы предоставить образец приложения? - person Riaz as kather; 05.03.2016
comment
Можете ли вы добавить определение своей модели в вопрос и используемую версию MySQL? Так что я могу попробовать с тем же типом данных на моей стороне - person Jonathan Muller; 05.03.2016
comment
При попытке я вижу, что в первом поле у ​​вас есть " users" вместо "users", может быть это он? - person Jonathan Muller; 05.03.2016
comment
Давайте продолжим обсуждение в чате. - person Jonathan Muller; 05.03.2016
comment
{где: {sharedusers: {regexp: /513/ } } } Я попробовал этот код. Он возвращает все значения, если что-либо совпадает с объектом {accessType:0,permission:1,specificUsers: [{users:502,512,513,permission:1 }]} . например {где: {sharedusers: {regexp: /0/ } } } Я попробовал этот запрос, он возвращает результат из-за типа доступа: 0. Я хочу найти в определенной пользовательской области. - person Riaz as kather; 05.03.2016
comment
Вы встраиваете подобъекты в строки, хранящиеся в базе данных, которая не поддерживает JSON: вам следует подумать об обновлении вашей БД и изменении вашей модели или использовать правильные отношения в ваших определениях сильного цикла. - person Jonathan Muller; 05.03.2016
comment
Я изменил строку в массив. то есть {accessType:0,permission:1,specificUsers: [{users:[502,512,513],permission:1}]} правильно? - person Riaz as kather; 05.03.2016
comment
Да. И как только тип данных станет объектом, вы можете использовать "sharedusers.users": "513" - person Jonathan Muller; 05.03.2016
comment
Я пытаюсь, но получаю сообщение об ошибке неизвестного столбца. и я проверил схему таблицы в mysql, она показывает тип данных TEXT. мое определение модели у меня есть объект упоминания. - person Riaz as kather; 05.03.2016
comment
Я думаю, это потому, что вы не используете mysql 5.7. В памяти работает? - person Jonathan Muller; 05.03.2016
comment
да, я пытался вернуть пустой массив. Можете ли вы предоставить любой образец? - person Riaz as kather; 05.03.2016