まず、新しいテーブルを作成します。
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構文は先頭の$を使用してドキュメントの特定の部分を示します。 データを取得するさまざまな方法を次に示します。
- specs-> "$。colors"は色の配列を返します
- specs-> "$。colors [0]"はJSON文字列 "black"を返します
- specs-> "$。non_existing"はNULLを返します
- specs-> "$。 'スペース付きのキー名'"キーにスペースが含まれる場合
キーが有効な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はそれらを処理します。