首页 文章

如何使用Strongloop中的正则表达式在mysql中搜索JSON数据

提问于
浏览
0

我已将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'

1 回答

  • 0

    当数据类型为object时,Strongloop会在子字段中为您工作,这会导致一些反直觉的查询,例如在您的情况下(但是当您习惯MongoDB / Postgres查询样式时非常直观)

    你应该用

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

    根据我对您的查询的理解,正则表达式不匹配:

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

    您可以将数据库存储更改为 users 作为字符串数组:如果您使用带有JSON支持的MySQL(https://dev.mysql.com/doc/refman/5.7/en/json.html),它会快得多,您可以执行以下操作:

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

    它会快得多

    编辑:在多个注释和问题更新后,我的答案无效,因为您正在为sharedusers字段使用String数据类型 .

相关问题