Как да търсите JSON данни в mysql с помощта на регулярен израз в Strongloop

Съхраних JSON данни в таблица. Искам да извлека данни въз основа на userId, userId е свойство на Users Object.

Пример: Искам да извлека всички записи, ако потребителите съдържат 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 връща грешка неизвестна колона. съхранение в паметта връща празен масив. можете ли да предоставите примерно приложение? - 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 }]} . например {where: {sharedusers: {regexp: /0/ } } } Опитах тази заявка, тя връща резултат поради accessType:0. Искам да намеря в конкретна потребителска област. - person Riaz as kather; 05.03.2016
comment
Вие вграждате подобекти в низове, съхранени в база данни, която не поддържа JSON: трябва да обмислите актуализиране на вашата DB и промяна на модела ви или да използвате правилни отношения в дефинициите си на силна линия - 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