2017-09-26 5 views
0

私は2つのモデルFooBarを持っています。 FooにはフィールドbarIdがあるため、それに関連付けられたオブジェクトは1つです。Bar 私はすべての私のFooオブジェクトを照会し、(私はsequelize-typescriptと活字体を使用しています)ように自分のassiciated Barオブジェクトを含めることができます。Sequelize.jsとPostgreSQLを使用して関連付けられたモデルのJSONBフィールドを照会

Foo.findAll<Foo>({ 
    include: [{ model: Bar }] 
}); 

Barオブジェクトは私ができる構造

{ inner_field1: 'some text', inner_field2: 'some more text' } 

とJSONBフィールドjsonb_fieldを持っていますクエリBarオブジェクトとフィルタをinner_field1と入力してください:

Bar.findAll<Bar>({ 
    where: { 'jsonb_field': { inner_field1: 'text to find' } } 
}); 

これは、次のSQLクエリを生成します。

SELECT ... FROM "Bar" AS "Bar" 
WHERE ("Bar"."jsonb_field"#>>'{inner_field1}') = 'text to find' 

をこれまでのところは良いです。私ができるので、正確に、私はバーのオブジェクトを含めていたレコードの

Error: Invalid value [object Object] 
    at Object.escape ({project_root}\node_modules\sequelize\lib\sql-string.js:50:11) 
    at Object.escape ({project_root}\node_modules\sequelize\lib\dialects\abstract\query-generator.js:917:22) 
    at Object.whereItemQuery ({project_root}\node_modules\sequelize\lib\dialects\abstract\query-generator.js:2095:41) 
    at _.forOwn ({project_root}\node_modules\sequelize\lib\dialects\abstract\query-generator.js:1937:25) 
    ... 

:今、これは例外をスロー

Foo.findAll<Foo>({ 
    where: { '$bar.jsonb_field$': { inner_field1: 'text to find' } }, 
    include: [{ model: Bar }] 
}); 

:今Barオブジェクトとフィルタリングinner_field1によるが含まれ、のはFooオブジェクトを照会してみましょう以下のような他の非JSONBプロパティによってフィルタ:

Foo.findAll<Foo>({ 
    where: { '$bar.number_field$': 5 }, 
    include: [{ model: Bar }] 
}); 

は、私の知る限りでは、問題がSequelize n個でありますjsonb_fieldの型を認識していないので、オブジェクトがwhereクエリーに渡されたときにエラーをスローします。

sequelize.literal()またはsequelize.json()を使用してこのエラーを回避する方法はありますか?

答えて

0

使用sequelize.cast$containsオペレータ:

Foo.findAll<Foo>({ 
    where: { '$bar.jsonb_field$': { 
    $contains: sequelize.cast('{ "inner_field1": "text to find" }', 'jsonb') 
    }, 
    include: [{ model: Bar }] 
}); 

それとも、提案として、それはsequelize.literalを使用してください:

Foo.findAll<Foo>({ 
    where: { '$bar.jsonb_field$': { 
    $contains: sequelize.literal(`'{ "inner_field1": "text to find" }'::json`) 
    }, 
    include: [{ model: Bar }] 
}); 

どちらのソリューションは、そのすべての文字をエスケープするか、削除することを確認するために、SQL Injectionsに対して脆弱です問題を引き起こす可能性があります("'、...)

はい、私は自分の質問にちょうど答えました。どういたしまして。

関連する問題