MySQL JSONデータ型のデコード

この投稿では、MySQL 5.7のJSONデータ型を調べ、ダイビング中にLaravelフレームワークを使用してクエリを作成します。



画像





まず、新しいテーブルを作成します。



CREATE TABLE `products` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `name` JSON, `specs` JSON, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
      
      







そして、いくつかの値を追加します。



 INSERT INTO products VALUES( null, '{"en": "phone", "it": "telefono"}', '{"colors": ["black", "white", "gold"], "size": {"weight": 1, "height": 1}}' ); INSERT INTO products VALUES( null, '{"en": "screen", "it": "schermo"}', '{"colors": ["black", "silver"], "size": {"weight": 2, "height": 3}}' ); INSERT INTO products VALUES( null, '{"en": "car", "it": "auto"}', '{"colors": ["red", "blue"], "size": {"weight": 40, "height": 34}}' );
      
      







JSON値の読み取り





簡単な構文を使用してJSON列の値を読み取ることができます。



 select name->"$.en" as name, specs->"$.size.weight" as weight, specs->"$.colors" as colors from products;
      
      







次の結果が得られます。



お名前 重さ
「電話」 1 [「黒」、「白」、「金」]
「スクリーン」 2 [「黒」、「銀」]
「車」 40 [「赤」、「青」]




お気づきかもしれませんが、結果はJSON形式の文字列として取得されます。つまり、画面に表示する前にデコードする必要があります。



 json_decode( Products::selectRaw('name->"$.en" as name')->first()->name )
      
      







構文について





JSON形式のクエリは、「 -> 」演算子を使用して実行され、演算子列の名前が左側に、パス構文が右側に配置されます。



セレクターが後に続くJSON形式でドキュメントを表すために、PATH構文は先頭の$を使用してドキュメントの特定の部分を示します。 データを取得するさまざまな方法を次に示します。







キーが有効なECMAScript識別子でない場合は、パス内で引用符で囲む必要があります。



ルックアップを使用する





マスクを使用してJSON値を要求することもできます。 次のデータがあるとします。



 {"name": "phone", "price": 400, "sizes": [3, 4, 5]}
      
      







構文 結果 ご注意
仕様-> "$。*" ['phone'、[3、4、5]、[{'name': 'black'}、{'name': 'gold'}]]
仕様-> "$。サイズ[*]" [3、4、5] $ .sizesと同じ
仕様-> "$。色**。名前" [「黒」、「金」] 構文「prefix ** suffix」は、プレフィックスで始まり、サフィックスで終わるすべてのパスを要求します。




JSON形式の値をリクエストする





これは、通常のMySQLカラムと同じように機能します。 JSON形式で値をクエリおよび/またはソートするための正しいパスを書く方法がわかったので、いくつかの例を見てみましょう:



 select name->"$.en" from products where name->"$.en" = "phone"; select name->"$.en" from products where name->"$.en" IN ("phone"); select specs->"$.size.weight" from products where specs->"$.size.weight" BETWEEN 1 AND 10; select * from products ORDER BY name->"$.en";
      
      







MySQL JSONデータ型とLaravelフレームワーク





Laravelフレームワークバージョン5.2.23以降を使用する場合、クエリデザイナを自由に使用して、JSON形式でリクエストを生成できます。



 Product::where('name->en', 'car')->first(); Product::whereIn('specs->size->weight', [1, 2, 3])->get(); Product::select('name->en')->orderBy('specs->size->height', 'DESC')->get();
      
      







そうでない場合は、 RAWを使用する必要があります。



 Product::whereRaw('name->"$.en"', 'car')->first();
      
      







おわりに





多くの場合、開発者は特定の機能、柔軟性、および/またはパフォーマンスのためにNoSQLデータベースを好みますが、SQLデータベースが好まれ、多くの大企業はMySQL +バンドル(Mongo | Redis |など)が、これによりスタックが複雑になります。 MySQLにJSONデータ型が導入されたため、一種のハイブリッドSQL-NoSQLデータベースになりました。



翻訳者から



「クリスマスツリー」が表示されている例では、「引用符」を付ける必要があります。 このHabrはそれらを処理します。



All Articles