2017-04-12 84 views
0

我有postgres与JSONB数据类型即两列。 'category'和'subcategory'。我需要根据用户的输入来搜索这些列。 JSON在“类别”一栏的样子:

[{id: 36, name: "categoryName1"},{id: 42, name: "categoryName2"}] 

和JSON在“子类别”栏的样子:

[{id: 52, name: "subCategoryName1"},{id: 56, name: "subCategoryName2"}, {id: 70, name: "subCategoryName1"}] 

输入可以是“ID”,也可以是一个“name'.The查询我写了尽可能远的尝试在每个提供的输入列中找到完全相同的名称。但我想让用户甚至可以通过部分名称查找,所以试图使用$ilike运算符。查询如下:

Model.findAll({ 
     where: { 
      $or: { 
      category: { 
       $contains: [{ 
       "name": { 
        $ilike: '%' + term + '%' 
       } 
       }] 
      }, 
      subcategory: { 
       $contains: [{ 
       "name": { 
        '$ilike': '%' + term + '%' 
       } 
       }] 
      } 
      } 
     } 
     }) 

原始查询:

SELECT "category", "subcategory" FROM "table" AS "table" 
WHERE "table"."category" @> '[{"name":{"$ilike":"%subCategoryName2%"}}]' 
OR "table"."subcategory" @> '[{"name":{"$ilike":"%subCategoryName2%"}}]' 
+0

为什么ILIKE!?我认为你应该使用$不需要扣款 – farhadamjady

+0

我想让搜索大小写不敏感。我尝试了'$ ilike',但没有引用。 – Leo

+0

1)[运营商](http://docs.sequelizejs.com/en/latest/docs/querying/)是'$ iLike'(注意大写'L')2)你可能不能混合$包含“与其他任何东西。 PostgreSQL没有任何简单的操作符来做到这一点。在SQL层面上,你可以通过'('LATERAL')JOIN'jsonb_array_elements()'](http://stackoverflow.com/search?q=%5Bpostgresql%5D+like+json+array),但我怀疑这种续集会隐含地为你做到这一点。 – pozs

回答

0

,这可能是你的答案:

{ 
    subcategory: { 
     $contains: { 
      name: { 
       $ilike: '%' + term + '%' 
     } 
    } 
    } 
    } 
+0

我也试过这个。它不工作。我尝试'$或'和'$ contains'作为数组和对象。没有办法工作 – Leo

+0

什么是你的续集版本?如果您使用旧版本,则应该更改符号@Leo – farhadamjady

+0

我正在使用Sequelize 3.23.4。 @farhadamjady – Leo

相关问题