8.14. Ð¢Ð¸Ð¿Ñ JSON #
- 8.14.1. СинÑакÑÐ¸Ñ Ð²Ð²Ð¾Ð´Ð¸Ð¼ÑÑ
и вÑводимÑÑ
знаÑений JSON
- 8.14.2. ÐÑоекÑиÑование докÑменÑов JSON
- 8.14.3. ÐÑовеÑки на Ð²Ñ Ð¾Ð¶Ð´ÐµÐ½Ð¸Ðµ и ÑÑÑеÑÑвование
jsonb- 8.14.4. ÐндекÑаÑиÑ
jsonb- 8.14.5. ÐбÑаÑение по индекÑÑ Ðº ÑлеменÑам
jsonb- 8.14.6. ТÑанÑÑоÑмаÑии
- 8.14.7. Тип jsonpath
- 8.14.2. ÐÑоекÑиÑование докÑменÑов JSON
Ð¢Ð¸Ð¿Ñ JSON пÑедназнаÑÐµÐ½Ñ Ð´Ð»Ñ Ñ
ÑÐ°Ð½ÐµÐ½Ð¸Ñ Ð´Ð°Ð½Ð½ÑÑ
JSON (JavaScript Object Notation, ÐапиÑÑ Ð¾Ð±ÑекÑа JavaScript) ÑоглаÑно ÑÑандаÑÑÑ RFC 7159. Такие даннÑе можно Ñ
ÑаниÑÑ Ð¸ в Ñипе text, но ÑÐ¸Ð¿Ñ JSON лÑÑÑе Ñем, ÑÑо пÑовеÑÑÑÑ, ÑооÑвеÑÑÑвÑÐµÑ Ð»Ð¸ вводимое знаÑение ÑоÑмаÑÑ JSON. ÐÐ»Ñ ÑабоÑÑ Ñ Ð½Ð¸Ð¼Ð¸ еÑÑÑ Ñакже неÑколÑко ÑпеÑиалÑнÑÑ
ÑÑнкÑий и опеÑаÑоÑов; Ñм. Раздел 9.16.
Ð PostgreSQL имеÑÑÑÑ Ð´Ð²Ð° Ñипа Ð´Ð»Ñ Ñ
ÑÐ°Ð½ÐµÐ½Ð¸Ñ Ð´Ð°Ð½Ð½ÑÑ
JSON: json и jsonb. ÐÐ»Ñ ÑеализаÑии ÑÑÑекÑивного меÑ
анизма запÑоÑов к ÑÑим Ñипам даннÑÑ
в PostgreSQL Ñакже имееÑÑÑ Ñип jsonpath, опиÑаннÑй в ÐодÑазделе 8.14.7.
Ð¢Ð¸Ð¿Ñ Ð´Ð°Ð½Ð½ÑÑ
json и jsonb пÑинимаÑÑ Ð½Ð° вÑ
од поÑÑи одинаковÑе набоÑÑ Ð·Ð½Ð°Ñений, а оÑлиÑаÑÑÑÑ Ð¾Ð½Ð¸ главнÑм обÑазом Ñ ÑоÑки зÑÐµÐ½Ð¸Ñ ÑÑÑекÑивноÑÑи. Тип json ÑоÑ
ÑанÑÐµÑ ÑоÑнÑÑ ÐºÐ¾Ð¿Ð¸Ñ Ð²Ð²ÐµÐ´Ñнного ÑекÑÑа, коÑоÑÑÑ ÑÑнкÑии обÑабоÑки Ð´Ð¾Ð»Ð¶Ð½Ñ ÑазбиÑаÑÑ Ð·Ð°Ð½Ð¾Ð²Ð¾ пÑи каждом вÑполнении запÑоÑа, Ñогда как даннÑе jsonb ÑоÑ
ÑанÑÑÑÑÑ Ð² ÑазобÑанном двоиÑном ÑоÑмаÑе, ÑÑо неÑколÑко замедлÑÐµÑ Ð²Ð²Ð¾Ð´ из-за пÑеобÑазованиÑ, но знаÑиÑелÑно ÑÑкоÑÑÐµÑ Ð¾Ð±ÑабоÑкÑ, не ÑÑебÑÑ Ð¼Ð½Ð¾Ð³Ð¾ÐºÑаÑного ÑазбоÑа ÑекÑÑа. ÐÑоме Ñого, jsonb поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ Ð¸Ð½Ð´ÐµÐºÑаÑиÑ, ÑÑо Ñоже Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¾ÑÐµÐ½Ñ Ð¿Ð¾Ð»ÐµÐ·Ð½Ð¾.
Так как Ñип json ÑоÑ
ÑанÑÐµÑ ÑоÑнÑÑ ÐºÐ¾Ð¿Ð¸Ñ Ð²Ð²ÐµÐ´Ñнного ÑекÑÑа, он ÑоÑ
ÑанÑÐµÑ ÑеманÑиÑеÑки незнаÑаÑие пÑÐ¾Ð±ÐµÐ»Ñ Ð¼ÐµÐ¶Ð´Ñ ÑлеменÑами, а Ñакже поÑÑдок клÑÑей в JSON-обÑекÑаÑ
. РеÑли JSON-обÑÐµÐºÑ Ð²Ð½ÑÑÑи ÑодеÑÐ¶Ð¸Ñ Ð¿Ð¾Ð²ÑоÑÑÑÑиеÑÑ ÐºÐ»ÑÑи, ÑÑÐ¾Ñ Ñип ÑоÑ
ÑÐ°Ð½Ð¸Ñ Ð²Ñе паÑÑ ÐºÐ»ÑÑ/знаÑение. (ФÑнкÑии обÑабоÑки бÑдÑÑ ÑÑиÑаÑÑ Ð´ÐµÐ¹ÑÑвиÑелÑной поÑледнÑÑ Ð¿Ð°ÑÑ.) Тип jsonb, напÑоÑив, не ÑоÑ
ÑанÑÐµÑ Ð¿ÑобелÑ, поÑÑдок клÑÑей и знаÑÐµÐ½Ð¸Ñ Ñ Ð´ÑблиÑÑÑÑимиÑÑ ÐºÐ»ÑÑами. ÐÑли во вÑ
однÑÑ
даннÑÑ
оказÑваÑÑÑÑ Ð´ÑблиÑÑÑÑиеÑÑ ÐºÐ»ÑÑи, ÑоÑ
ÑанÑеÑÑÑ ÑолÑко поÑледнее знаÑение.
ÐÐ»Ñ Ð±Ð¾Ð»ÑÑинÑÑва пÑиложений пÑедпоÑÑиÑелÑнее Ñ
ÑаниÑÑ Ð´Ð°Ð½Ð½Ñе JSON в Ñипе jsonb (еÑли Ð½ÐµÑ Ð¾ÑобÑÑ
пÑоÑивопоказаний, напÑÐ¸Ð¼ÐµÑ Ð²Ð°Ð¶Ð½Ñ Ð¿Ñежние пÑÐµÐ´Ð¿Ð¾Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¾ поÑÑдке клÑÑей обÑекÑов).
Ð RFC 7159 говоÑиÑÑÑ, ÑÑо ÑÑÑоки JSON Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±ÑÑÑ Ð¿ÑедÑÑÐ°Ð²Ð»ÐµÐ½Ñ Ð² кодиÑовке UTF-8. ÐоÑÑÐ¾Ð¼Ñ Ð´Ð°Ð½Ð½Ñе JSON не бÑдÑÑ Ð¿Ð¾Ð»Ð½Ð¾ÑÑÑÑ ÑооÑвеÑÑÑвоваÑÑ ÑпеÑиÑикаÑии, еÑли кодиÑовка Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ Ð½Ðµ UTF-8. ÐÑи ÑÑом нелÑÐ·Ñ Ð±ÑÐ´ÐµÑ Ð²ÑÑавиÑÑ Ð² JSON ÑимволÑ, непÑедÑÑавимÑе в кодиÑовке ÑеÑвеÑа, и наобоÑоÑ, допÑÑÑимÑми бÑдÑÑ ÑимволÑ, пÑедÑÑавимÑе в кодиÑовке ÑеÑвеÑа, но не в UTF-8.
RFC 7159 ÑазÑеÑÐ°ÐµÑ Ð²ÐºÐ»ÑÑаÑÑ Ð² ÑÑÑоки JSON ÑпеÑпоÑледоваÑелÑноÑÑи Unicode в виде \u. Ð ÑÑнкÑÐ¸Ñ Ð²Ð²Ð¾Ð´Ð° Ð´Ð»Ñ Ñипа XXXXjson ÑÑи ÑпеÑпоÑледоваÑелÑноÑÑи допÑÑкаÑÑÑÑ Ð²Ð½Ðµ завиÑимоÑÑи Ð¾Ñ ÐºÐ¾Ð´Ð¸Ñовки Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ
, и пÑовеÑÑеÑÑÑ ÑолÑко пÑавилÑноÑÑÑ Ð¸Ñ
ÑинÑакÑиÑа (за \u Ð´Ð¾Ð»Ð¶Ð½Ñ ÑледоваÑÑ ÑеÑÑÑе ÑеÑÑнадÑаÑеÑиÑнÑÑ
ÑиÑÑÑ). Ðднако ÑÑнкÑÐ¸Ñ Ð²Ð²Ð¾Ð´Ð° Ð´Ð»Ñ Ñипа jsonb более ÑÑÑогаÑ: она не допÑÑÐºÐ°ÐµÑ ÑпеÑпоÑледоваÑелÑноÑÑи Unicode Ð´Ð»Ñ Ñимволов, коÑоÑÑе не могÑÑ Ð±ÑÑÑ Ð¿ÑедÑÑÐ°Ð²Ð»ÐµÐ½Ñ Ð² кодиÑовке базÑ. Тип jsonb Ñакже не пÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ \u0000 (Ñак как ÑÑо знаÑение не Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿ÑедÑÑавлено в Ñипе text PostgreSQL) и ÑÑебÑеÑ, ÑÑÐ¾Ð±Ñ ÑÑÑÑогаÑнÑе паÑÑ Unicode иÑполÑзовалиÑÑ Ð´Ð»Ñ Ð¿ÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ñимволов вне оÑновной многоÑзÑковой плоÑкоÑÑи (BMP) пÑавилÑно. ÐоÑÑекÑнÑе ÑпеÑпоÑледоваÑелÑноÑÑи Unicode пÑеобÑазÑÑÑÑÑ Ð´Ð»Ñ Ñ
ÑÐ°Ð½ÐµÐ½Ð¸Ñ Ð² один ÑооÑвеÑÑÑвÑÑÑий Ñимвол (ÑÑо подÑазÑÐ¼ÐµÐ²Ð°ÐµÑ ÑвоÑаÑивание ÑÑÑÑогаÑнÑÑ
Ð¿Ð°Ñ Ð² один Ñимвол).
ÐÑимеÑание
Ðногие из ÑÑнкÑий обÑабоÑки JSON, опиÑаннÑе в Разделе 9.16, пÑеобÑазÑÑÑ ÑпеÑпоÑледоваÑелÑноÑÑи Unicode в обÑÑнÑе ÑимволÑ, поÑÑÐ¾Ð¼Ñ Ð¼Ð¾Ð³ÑÑ Ð²ÑдаваÑÑ Ð¿Ð¾Ð´Ð¾Ð±Ð½Ñе оÑибки, даже еÑли им на вÑ
од поÑÑÑÐ¿Ð°ÐµÑ Ñип json, а не jsonb. То, ÑÑо ÑÑнкÑÐ¸Ñ Ð²Ð²Ð¾Ð´Ð° в Ñип json не пÑÐ¾Ð¸Ð·Ð²Ð¾Ð´Ð¸Ñ ÑÑиÑ
пÑовеÑок, можно ÑÑиÑаÑÑ Ð¸ÑÑоÑиÑеÑким аÑÑеÑакÑом, Ñ
оÑÑ ÑÑо и позволÑÐµÑ Ð¿ÑоÑÑо ÑоÑ
ÑанÑÑÑ (но не обÑабаÑÑваÑÑ) в JSON ÑпеÑÐºÐ¾Ð´Ñ Unicode в базе даннÑÑ
Ñ ÐºÐ¾Ð´Ð¸Ñовкой, в коÑоÑой пÑедÑÑавленнÑе Ñаким обÑазом ÑÐ¸Ð¼Ð²Ð¾Ð»Ñ Ð¾ÑÑÑÑÑÑвÑÑÑ.
ÐÑи пÑеобÑазовании вводимого ÑекÑÑа JSON в Ñип jsonb, пÑимиÑивнÑе ÑипÑ, опиÑаннÑе в RFC 7159, по ÑÑÑи оÑобÑажаÑÑÑÑ Ð² ÑобÑÑвеннÑе ÑÐ¸Ð¿Ñ PostgreSQL как показано в ТаблиÑе 8.23. Таким обÑазом, к ÑодеÑÐ¶Ð¸Ð¼Ð¾Ð¼Ñ Ñипа jsonb пÑедÑÑвлÑÑÑÑÑ Ð½ÐµÐºÐ¾ÑоÑÑе дополниÑелÑнÑе ÑÑебованиÑ, пÑодикÑованнÑе огÑаниÑениÑми пÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð½Ð¸Ð¶ÐµÐ»ÐµÐ¶Ð°Ñего Ñипа даннÑÑ
, коÑоÑÑе не ÑаÑпÑоÑÑÑанÑÑÑÑÑ Ð½Ð¸ на Ñип json, ни на ÑоÑÐ¼Ð°Ñ JSON вообÑе. Ð ÑаÑÑноÑÑи, Ñип jsonb не пÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ ÑиÑла, вÑÑ
одÑÑие за диапазон Ñипа даннÑÑ
PostgreSQL numeric, Ñогда как Ñ json Ñакого огÑаниÑÐµÐ½Ð¸Ñ Ð½ÐµÑ. Такие огÑаниÑениÑ, накладÑваемÑе ÑеализаÑией, допÑÑкаÑÑÑÑ ÑоглаÑно RFC 7159. Ðднако на пÑакÑике Ñакие пÑÐ¾Ð±Ð»ÐµÐ¼Ñ Ð±Ð¾Ð»ÐµÐµ веÑоÑÑÐ½Ñ Ð² дÑÑгиÑ
ÑеализаÑиÑÑ
, Ñак как обÑÑно пÑимиÑивнÑй Ñип JSON number пÑедÑÑавлÑеÑÑÑ Ð² виде ÑиÑла Ñ Ð¿Ð»Ð°Ð²Ð°ÑÑей ÑоÑкой двойной ÑоÑноÑÑи IEEE 754 (ÑÑо RFC 7159 Ñвно пÑизнаÑÑ Ð¸ допÑÑкаеÑ). ÐÑи иÑполÑзовании JSON в каÑеÑÑве ÑоÑмаÑа обмена даннÑми Ñ Ñакими ÑиÑÑемами ÑледÑÐµÑ ÑÑиÑÑваÑÑ ÑиÑки поÑеÑи ÑоÑноÑÑи ÑиÑел, Ñ
ÑанивÑиÑ
ÑÑ Ð² PostgreSQL.
РнапÑоÑив, как показано в ÑаблиÑе, еÑÑÑ Ð½ÐµÐºÐ¾ÑоÑÑе огÑаниÑÐµÐ½Ð¸Ñ Ð² ÑоÑмаÑе ввода пÑимиÑивнÑÑ Ñипов JSON, не акÑÑалÑнÑе Ð´Ð»Ñ ÑооÑвеÑÑÑвÑÑÑÐ¸Ñ Ñипов PostgreSQL.
ТаблиÑа 8.23. ÐÑимиÑивнÑе ÑÐ¸Ð¿Ñ JSON и ÑооÑвеÑÑÑвÑÑÑие им ÑÐ¸Ð¿Ñ PostgreSQL
| ÐÑимиÑивнÑй Ñип JSON | Тип PostgreSQL | ÐÑимеÑÐ°Ð½Ð¸Ñ |
|---|---|---|
string | text | \u0000 не допÑÑкаеÑÑÑ ÐºÐ°Ðº ÑпеÑпоÑледоваÑелÑноÑÑÑ Unicode, пÑедÑÑавлÑÑÑÐ°Ñ Ñимвол, коÑоÑÑй оÑÑÑÑÑÑвÑÐµÑ Ð² кодиÑовке Ð±Ð°Ð·Ñ |
number | numeric | ÐнаÑÐµÐ½Ð¸Ñ NaN и infinity не допÑÑкаÑÑÑÑ |
boolean | boolean | ÐопÑÑкаÑÑÑÑ ÑолÑко ваÑианÑÑ true и false (в нижнем ÑегиÑÑÑе) |
null | (неÑ) | NULL в SQL Ð¸Ð¼ÐµÐµÑ Ð´ÑÑгой ÑмÑÑл |
8.14.1. СинÑакÑÐ¸Ñ Ð²Ð²Ð¾Ð´Ð¸Ð¼ÑÑ Ð¸ вÑводимÑÑ Ð·Ð½Ð°Ñений JSON #
СинÑакÑÐ¸Ñ Ð²Ð²Ð¾Ð´Ð°-вÑвода Ñипов даннÑÑ JSON ÑооÑвеÑÑÑвÑÐµÑ ÑÑандаÑÑÑ RFC 7159.
ÐÑимеÑÑ Ð´Ð¾Ð¿ÑÑÑимÑÑ
вÑÑажений Ñ Ñипом json (или jsonb):
-- ÐÑоÑÑое ÑкалÑÑное/пÑимиÑивное знаÑение
-- ÐÑоÑÑÑми знаÑениÑми могÑÑ Ð±ÑÑÑ ÑиÑла, ÑÑÑоки в кавÑÑкаÑ
, true, false или null
SELECT '5'::json;
-- ÐаÑÑив из нÑÐ»Ñ Ð¸ более ÑлеменÑов (ÑлеменÑÑ Ð¼Ð¾Ð³ÑÑ Ð±ÑÑÑ ÑазнÑÑ
Ñипов)
SELECT '[1, 2, "foo", null]'::json;
-- ÐбÑекÑ, ÑодеÑжаÑий паÑÑ ÐºÐ»ÑÑей и знаÑений
-- ÐамеÑÑÑе, ÑÑо клÑÑи обÑекÑов â ÑÑо вÑегда ÑÑÑоки в кавÑÑкаÑ
SELECT '{"bar": "baz", "balance": 7.77, "active": false}'::json;
-- ÐаÑÑÐ¸Ð²Ñ Ð¸ обÑекÑÑ Ð¼Ð¾Ð³ÑÑ Ð²ÐºÐ»Ð°Ð´ÑваÑÑÑÑ Ð¿ÑоизволÑнÑм обÑазом
SELECT '{"foo": [true, "bar"], "tags": {"a": 1, "b": null}}'::json;Ðак бÑло Ñказано Ñанее, когда знаÑение JSON вводиÑÑÑ Ð¸ заÑем вÑводиÑÑÑ Ð±ÐµÐ· дополниÑелÑной обÑабоÑки, Ñип json вÑÐ²Ð¾Ð´Ð¸Ñ ÑÐ¾Ñ Ð¶Ðµ ÑекÑÑ, ÑÑо поÑÑÑпил на вÑ
од, а jsonb не ÑоÑ
ÑанÑÐµÑ ÑеманÑиÑеÑки незнаÑаÑие деÑали, Ñакие как пÑобелÑ. ÐапÑимеÑ, поÑмоÑÑиÑе на ÑÑи ÑазлиÑиÑ:
SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::json;
json
-------------------------------------------------
{"bar": "baz", "balance": 7.77, "active":false}
(1 row)
SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::jsonb;
jsonb
--------------------------------------------------
{"bar": "baz", "active": false, "balance": 7.77}
(1 row) ÐеÑÐ²Ð°Ñ ÑеманÑиÑеÑки незнаÑÐ¸Ð¼Ð°Ñ Ð´ÐµÑалÑ, заÑлÑживаÑÑÐ°Ñ Ð²Ð½Ð¸Ð¼Ð°Ð½Ð¸Ñ: Ñ jsonb ÑиÑла вÑводÑÑÑÑ Ð¿Ð¾ пÑавилам нижележаÑего Ñипа numeric. Ðа пÑакÑике ÑÑо ознаÑаеÑ, ÑÑо ÑиÑла, заданнÑе в запиÑи Ñ E, бÑдÑÑ Ð²ÑÐ²ÐµÐ´ÐµÐ½Ñ Ð±ÐµÐ· неÑ, напÑимеÑ:
SELECT '{"reading": 1.230e-5}'::json, '{"reading": 1.230e-5}'::jsonb;
json | jsonb
-----------------------+-------------------------
{"reading": 1.230e-5} | {"reading": 0.00001230}
(1 row) Ðднако как видно из ÑÑого пÑимеÑа, jsonb ÑоÑ
ÑанÑÐµÑ ÐºÐ¾Ð½ÐµÑнÑе нÑли дÑобного ÑиÑла, Ñ
оÑÑ Ð¾Ð½Ð¸ и не имеÑÑ ÑеманÑиÑеÑкой знаÑимоÑÑи, в ÑаÑÑноÑÑи Ð´Ð»Ñ Ð¿ÑовеÑки на ÑавенÑÑво.
СпиÑок вÑÑÑоеннÑÑ ÑÑнкÑий и опеÑаÑоÑов, позволÑÑÑÐ¸Ñ ÑоздаваÑÑ Ð¸ обÑабаÑÑваÑÑ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ JSON, пÑиведÑн в Разделе 9.16.
8.14.2. ÐÑоекÑиÑование докÑменÑов JSON #
ÐÑедÑÑавлÑÑÑ Ð´Ð°Ð½Ð½Ñе в JSON можно гоÑаздо более гибко, Ñем в ÑÑадиÑионной ÑелÑÑионной модели даннÑÑ , ÑÑо оÑÐµÐ½Ñ Ð¿ÑивлекаÑелÑно Ñам, где Ð½ÐµÑ Ð¶ÑÑÑÐºÐ¸Ñ ÑÑловий. Роба ÑÑÐ¸Ñ Ð¿Ð¾Ð´Ñ Ð¾Ð´Ð° вполне могÑÑ ÑоÑÑÑеÑÑвоваÑÑ Ð¸ дополнÑÑÑ Ð´ÑÑг дÑÑга в одном пÑиложении. Ðднако даже Ð´Ð»Ñ Ð¿Ñиложений, коÑоÑÑм нÑжна макÑималÑÐ½Ð°Ñ Ð³Ð¸Ð±ÐºÐ¾ÑÑÑ, ÑекомендÑеÑÑÑ, ÑÑÐ¾Ð±Ñ Ð´Ð¾ÐºÑменÑÑ JSON имели некоÑоÑÑÑ ÑикÑиÑованнÑÑ ÑÑÑÑкÑÑÑÑ. ÐÑа ÑÑÑÑкÑÑÑа обÑÑно не навÑзÑваеÑÑÑ Ð¶ÑÑÑко (Ñ Ð¾ÑÑ Ð¼Ð¾Ð¶Ð½Ð¾ деклаÑаÑивно дикÑоваÑÑ Ð½ÐµÐºÐ¾ÑоÑÑе бизнеÑ-пÑавила), но когда она пÑедÑказÑема, ÑÑановиÑÑÑ Ð³Ð¾Ñаздо пÑоÑе пиÑаÑÑ Ð·Ð°Ð¿ÑоÑÑ, коÑоÑÑе извлекаÑÑ Ð¿Ð¾Ð»ÐµÐ·Ð½Ñе даннÑе из набоÑа «докÑменÑов» (инÑоÑмаÑии) в ÑаблиÑе.
ÐаннÑе JSON, как и даннÑе лÑбÑÑ Ð´ÑÑÐ³Ð¸Ñ Ñипов, Ñ ÑанÑÑиеÑÑ Ð² ÑаблиÑÐ°Ñ , Ð½Ð°Ñ Ð¾Ð´ÑÑÑÑ Ð¿Ð¾Ð´ конÑÑолем Ð¼ÐµÑ Ð°Ð½Ð¸Ð·Ð¼Ð° паÑаллелÑного доÑÑÑпа. ХоÑÑ Ñ ÑаниÑÑ Ð±Ð¾Ð»ÑÑие докÑменÑÑ Ð²Ð¿Ð¾Ð»Ð½Ðµ возможно, не забÑвайÑе, ÑÑо пÑи лÑбом изменении ÑÑÑанавливаеÑÑÑ Ð±Ð»Ð¾ÐºÐ¸Ñовка вÑей ÑÑÑоки (на ÑÑовне ÑÑÑоки). ÐоÑÑÐ¾Ð¼Ñ Ð´Ð»Ñ Ð¾Ð¿ÑимизаÑии блокиÑовок ÑÑанзакÑий, изменÑÑÑÐ¸Ñ Ð´Ð°Ð½Ð½Ñе, ÑÑÐ¾Ð¸Ñ Ð¾Ð³ÑаниÑиÑÑ ÑÐ°Ð·Ð¼ÐµÑ Ð´Ð¾ÐºÑменÑов JSON ÑазÑмнÑми пÑеделами. Ридеале каждÑй докÑÐ¼ÐµÐ½Ñ JSON должен Ñобой пÑедÑÑавлÑÑÑ Ð°ÑомаÑнÑй инÑоÑмаÑионнÑй блок, коÑоÑÑй, ÑоглаÑно бизнеÑ-логике, нелÑÐ·Ñ ÑазделиÑÑ Ð½Ð° менÑÑие, индивидÑалÑно изменÑемÑе блоки.
8.14.3. ÐÑовеÑки на вÑ
ождение и ÑÑÑеÑÑвование jsonb #
ÐÑовеÑка вÑ
Ð¾Ð¶Ð´ÐµÐ½Ð¸Ñ â Ð²Ð°Ð¶Ð½Ð°Ñ Ð¾ÑобенноÑÑÑ Ñипа jsonb, не имеÑÑÐ°Ñ Ð°Ð½Ð°Ð»Ð¾Ð³Ð° Ð´Ð»Ñ Ñипа json. ÐÑа пÑовеÑка опÑеделÑеÑ, вÑ
Ð¾Ð´Ð¸Ñ Ð»Ð¸ один докÑÐ¼ÐµÐ½Ñ jsonb в дÑÑгой. Ð ÑледÑÑÑиÑ
пÑимеÑаÑ
возвÑаÑаеÑÑÑ Ð¸ÑÑинное знаÑение (кÑоме ÑпомÑнÑÑÑÑ
иÑклÑÑений):
-- ÐÑоÑÑÑе ÑкалÑÑнÑе/пÑимиÑивнÑе знаÑÐµÐ½Ð¸Ñ Ð²ÐºÐ»ÑÑаÑÑ ÑолÑко одно иденÑиÑное знаÑение:
SELECT '"foo"'::jsonb @> '"foo"'::jsonb;
-- ÐаÑÑив Ñ Ð¿Ñавой ÑÑоÑÐ¾Ð½Ñ Ð²Ñ
Ð¾Ð´Ð¸Ñ Ð² маÑÑив Ñлева:
SELECT '[1, 2, 3]'::jsonb @> '[1, 3]'::jsonb;
-- ÐоÑÑдок ÑлеменÑов в маÑÑиве не важен, поÑÑÐ¾Ð¼Ñ ÑÑо ÑÑловие Ñоже вÑполнÑеÑÑÑ:
SELECT '[1, 2, 3]'::jsonb @> '[3, 1]'::jsonb;
-- РповÑоÑÑÑÑиеÑÑ ÑлеменÑÑ Ð¼Ð°ÑÑива не имеÑÑ Ð·Ð½Ð°ÑениÑ:
SELECT '[1, 2, 3]'::jsonb @> '[1, 2, 2]'::jsonb;
-- ÐбÑÐµÐºÑ Ñ Ð¾Ð´Ð½Ð¾Ð¹ паÑой ÑпÑава вÑ
Ð¾Ð´Ð¸Ñ Ð² обÑÐµÐºÑ Ñлева:
SELECT '{"product": "PostgreSQL", "version": 9.4, "jsonb": true}'::jsonb @> '{"version": 9.4}'::jsonb;
-- ÐаÑÑив ÑпÑава не ÑÑиÑаеÑÑÑ Ð²Ñ
одÑÑим в
-- маÑÑив Ñлева, Ñ
оÑÑ Ð² поÑледний и вложен подобнÑй маÑÑив:
SELECT '[1, 2, [1, 3]]'::jsonb @> '[1, 3]'::jsonb; -- вÑдаÑÑ false
-- Ðо еÑли добавиÑÑ ÑÑÐ¾Ð²ÐµÐ½Ñ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ð¾ÑÑи, пÑовеÑка на вÑ
ождение вÑполнÑеÑÑÑ:
SELECT '[1, 2, [1, 3]]'::jsonb @> '[[1, 3]]'::jsonb;
-- ÐналогиÑно, ÑÑо вÑ
ождением не ÑÑиÑаеÑÑÑ:
SELECT '{"foo": {"bar": "baz"}}'::jsonb @> '{"bar": "baz"}'::jsonb; -- вÑдаÑÑ false
-- ÐлÑÑ Ñ Ð¿ÑÑÑÑм обÑекÑом на веÑÑ
нем ÑÑовне вÑ
Ð¾Ð´Ð¸Ñ Ð² обÑÐµÐºÑ Ñ Ñаким клÑÑом:
SELECT '{"foo": {"bar": "baz"}}'::jsonb @> '{"foo": {}}'::jsonb;ÐбÑий пÑинÑип ÑÑой пÑовеÑки в Ñом, ÑÑо Ð²Ñ Ð¾Ð´ÑÑий обÑÐµÐºÑ Ð´Ð¾Ð»Ð¶ÐµÐ½ ÑооÑвеÑÑÑвоваÑÑ Ð¾Ð±ÑекÑÑ, ÑодеÑжаÑÐµÐ¼Ñ ÐµÐ³Ð¾, по ÑÑÑÑкÑÑÑе и даннÑм, возможно, поÑле иÑклÑÑÐµÐ½Ð¸Ñ Ð¸Ð· ÑодеÑжаÑего обÑекÑа лиÑÐ½Ð¸Ñ ÑлеменÑов маÑÑива или Ð¿Ð°Ñ ÐºÐ»ÑÑ/знаÑение. Ðо помниÑе, ÑÑо поÑÑдок ÑлеменÑов маÑÑива Ð´Ð»Ñ Ð¿ÑовеÑки на Ð²Ñ Ð¾Ð¶Ð´ÐµÐ½Ð¸Ðµ не Ð¸Ð¼ÐµÐµÑ Ð·Ð½Ð°ÑениÑ, а повÑоÑÑÑÑиеÑÑ ÑлеменÑÑ Ð¼Ð°ÑÑива ÑÑиÑаÑÑÑÑ ÑолÑко один Ñаз.
РкаÑеÑÑве оÑобого иÑклÑÑÐµÐ½Ð¸Ñ Ð´Ð»Ñ ÑÑÐµÐ±Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸Ð´ÐµÐ½ÑиÑноÑÑи ÑÑÑÑкÑÑÑ, маÑÑив Ð¼Ð¾Ð¶ÐµÑ ÑодеÑжаÑÑ Ð¿ÑимиÑивное знаÑение:
-- Ð ÑÑÐ¾Ñ Ð¼Ð°ÑÑив Ð²Ñ Ð¾Ð´Ð¸Ñ Ð¿ÑимиÑивное ÑÑÑоковое знаÑение: SELECT '["foo", "bar"]'::jsonb @> '"bar"'::jsonb; -- ÐÑо иÑклÑÑение дейÑÑвÑÐµÑ ÑолÑко в Ð¾Ð´Ð½Ñ ÑÑоÑÐ¾Ð½Ñ -- здеÑÑ Ð²Ñ Ð¾Ð¶Ð´ÐµÐ½Ð¸Ñ Ð½ÐµÑ: SELECT '"bar"'::jsonb @> '["bar"]'::jsonb; -- вÑдаÑÑ false
ÐÐ»Ñ Ñипа jsonb введÑн Ñакже опеÑаÑÐ¾Ñ ÑÑÑеÑÑвованиÑ, коÑоÑÑй ÑвлÑеÑÑÑ Ð²Ð°ÑиаÑией на ÑÐµÐ¼Ñ Ð²Ñ
ождениÑ: он пÑовеÑÑеÑ, ÑвлÑеÑÑÑ Ð»Ð¸ ÑÑÑока (Ð·Ð°Ð´Ð°Ð½Ð½Ð°Ñ Ð² виде знаÑÐµÐ½Ð¸Ñ text) клÑÑом обÑекÑа или ÑлеменÑом маÑÑива на веÑÑ
нем ÑÑовне знаÑÐµÐ½Ð¸Ñ jsonb. Ð ÑледÑÑÑиÑ
пÑимеÑаÑ
возвÑаÑаеÑÑÑ Ð¸ÑÑинное знаÑение (кÑоме ÑпомÑнÑÑÑÑ
иÑклÑÑений):
-- СÑÑока ÑÑÑеÑÑвÑÐµÑ Ð² каÑеÑÑве ÑлеменÑа маÑÑива:
SELECT '["foo", "bar", "baz"]'::jsonb ? 'bar';
-- СÑÑока ÑÑÑеÑÑвÑÐµÑ Ð² каÑеÑÑве клÑÑа обÑекÑа:
SELECT '{"foo": "bar"}'::jsonb ? 'foo';
-- ÐнаÑÐµÐ½Ð¸Ñ Ð¾Ð±ÑекÑов не ÑаÑÑмаÑÑиваÑÑÑÑ:
SELECT '{"foo": "bar"}'::jsonb ? 'bar'; -- вÑдаÑÑ false
-- Ðак и вÑ
ождение, ÑÑÑеÑÑвование опÑеделÑеÑÑÑ Ð½Ð° веÑÑ
нем ÑÑовне:
SELECT '{"foo": {"bar": "baz"}}'::jsonb ? 'bar'; -- вÑдаÑÑ false
-- СÑÑока ÑÑиÑаеÑÑÑ ÑÑÑеÑÑвÑÑÑей, еÑли она ÑооÑвеÑÑÑвÑÐµÑ Ð¿ÑимиÑивной ÑÑÑоке JSON:
SELECT '"foo"'::jsonb ? 'foo';ÐбÑекÑÑ JSON Ð´Ð»Ñ Ð¿ÑовеÑок на ÑÑÑеÑÑвование и Ð²Ñ Ð¾Ð¶Ð´ÐµÐ½Ð¸Ðµ Ñо множеÑÑвом клÑÑей или ÑлеменÑов Ð¿Ð¾Ð´Ñ Ð¾Ð´ÑÑ Ð±Ð¾Ð»ÑÑе, Ñем маÑÑивÑ, Ñак как, в оÑлиÑие Ð¾Ñ Ð¼Ð°ÑÑивов, они внÑÑÑи опÑимизиÑÑÑÑÑÑ Ð´Ð»Ñ Ð¿Ð¾Ð¸Ñка, и поиÑк ÑлеменÑа не бÑÐ´ÐµÑ Ð»Ð¸Ð½ÐµÐ¹Ð½Ñм.
ÐодÑказка
Так как вÑ
ождение в JSON пÑовеÑÑеÑÑÑ Ñ ÑÑÑÑом вложенноÑÑи, пÑавилÑно напиÑаннÑй запÑÐ¾Ñ Ð¼Ð¾Ð¶ÐµÑ Ð·Ð°Ð¼ÐµÐ½Ð¸ÑÑ ÑвнÑÑ Ð²ÑбоÑÐºÑ Ð²Ð½ÑÑÑенниÑ
обÑекÑов. ÐапÑимеÑ, пÑедположим, ÑÑо Ñ Ð½Ð°Ñ ÐµÑÑÑ ÑÑÐ¾Ð»Ð±ÐµÑ doc, ÑодеÑжаÑий обÑекÑÑ Ð½Ð° веÑÑ
нем ÑÑовне, и болÑÑинÑÑво ÑÑиÑ
обÑекÑов ÑодеÑÐ¶Ð¸Ñ Ð¿Ð¾Ð»Ñ tags Ñ Ð¼Ð°ÑÑивами вложеннÑÑ
обÑекÑов. ÐаннÑй запÑÐ¾Ñ Ð½Ð°Ð¹Ð´ÑÑ Ð·Ð°Ð¿Ð¸Ñи, в коÑоÑÑÑ
вложеннÑе обÑекÑÑ ÑодеÑÐ¶Ð°Ñ ÐºÐ»ÑÑи "term":"paris" и "term":"food", и пÑи ÑÑом пÑопÑÑÑÐ¸Ñ Ñакие клÑÑи, наÑ
одÑÑиеÑÑ Ð²Ð½Ðµ маÑÑива tags:
SELECT doc->'site_name' FROM websites
WHERE doc @> '{"tags":[{"term":"paris"}, {"term":"food"}]}';ÐÑого же ÑезÑлÑÑаÑа можно добиÑÑÑÑ, напÑимеÑ, Ñак:
SELECT doc->'site_name' FROM websites
WHERE doc->'tags' @> '[{"term":"paris"}, {"term":"food"}]';Ðо даннÑй Ð¿Ð¾Ð´Ñ Ð¾Ð´ менее гибкий и ÑаÑÑо Ñакже менее ÑÑÑекÑивнÑй.
С дÑÑгой ÑÑоÑонÑ, опеÑаÑÐ¾Ñ ÑÑÑеÑÑÐ²Ð¾Ð²Ð°Ð½Ð¸Ñ JSON не ÑÑиÑÑÐ²Ð°ÐµÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ð¾ÑÑÑ: он бÑÐ´ÐµÑ Ð¸ÑкаÑÑ Ð·Ð°Ð´Ð°Ð½Ð½Ñй клÑÑ Ð¸Ð»Ð¸ ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð¼Ð°ÑÑива ÑолÑко на веÑÑ Ð½ÐµÐ¼ ÑÑовне знаÑÐµÐ½Ð¸Ñ JSON.
РазлиÑнÑе опеÑаÑоÑÑ Ð²Ñ Ð¾Ð¶Ð´ÐµÐ½Ð¸Ñ Ð¸ ÑÑÑеÑÑвованиÑ, а Ñакже вÑе дÑÑгие опеÑаÑоÑÑ Ð¸ ÑÑнкÑии Ð´Ð»Ñ ÑабоÑÑ Ñ JSON докÑменÑиÑÐ¾Ð²Ð°Ð½Ñ Ð² Разделе 9.16.
8.14.4. ÐндекÑаÑÐ¸Ñ jsonb #
ÐÐ»Ñ ÑÑÑекÑивного поиÑка клÑÑей или Ð¿Ð°Ñ ÐºÐ»ÑÑ/знаÑение в болÑÑом колиÑеÑÑве докÑменÑов jsonb можно ÑÑпеÑно пÑименÑÑÑ Ð¸Ð½Ð´ÐµÐºÑÑ GIN. ÐÐ»Ñ ÑÑого пÑедоÑÑавлÑÑÑÑÑ Ð´Ð²Ð° «клаÑÑа опеÑаÑоÑов» GIN, пÑедлагаÑÑие вÑÐ±Ð¾Ñ Ð¼ÐµÐ¶Ð´Ñ Ð¿ÑоизводиÑелÑноÑÑÑÑ Ð¸ гибкоÑÑÑÑ.
ÐлаÑÑ Ð¾Ð¿ÐµÑаÑоÑов GIN по ÑмолÑÐ°Ð½Ð¸Ñ Ð´Ð»Ñ jsonb поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ Ð·Ð°Ð¿ÑоÑÑ Ñ Ð¾Ð¿ÐµÑаÑоÑами ÑÑÑеÑÑÐ²Ð¾Ð²Ð°Ð½Ð¸Ñ ÐºÐ»ÑÑа (?, ?| и ?&), опеÑаÑоÑом вклÑÑÐµÐ½Ð¸Ñ (@>) и опеÑаÑоÑами ÑооÑвеÑÑÑÐ²Ð¸Ñ Ð´Ð»Ñ jsonpath (@? и @@). (ÐодÑобнее ÑеманÑика, ÑеализÑÐµÐ¼Ð°Ñ ÑÑими опеÑаÑоÑами, опиÑана в ТаблиÑе 9.48.) ÐÑÐ¸Ð¼ÐµÑ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¸Ð½Ð´ÐµÐºÑа Ñ ÑÑим клаÑÑом опеÑаÑоÑов:
CREATE INDEX idxgin ON api USING GIN (jdoc);
ÐополниÑелÑнÑй клаÑÑ Ð¾Ð¿ÐµÑаÑоÑов GIN jsonb_path_ops не поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ Ð¾Ð¿ÐµÑаÑоÑÑ ÑÑÑеÑÑÐ²Ð¾Ð²Ð°Ð½Ð¸Ñ ÐºÐ»ÑÑа, но поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ @>, @? и @@. ÐÑÐ¸Ð¼ÐµÑ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¸Ð½Ð´ÐµÐºÑа Ñ ÑÑим клаÑÑом опеÑаÑоÑов:
CREATE INDEX idxginp ON api USING GIN (jdoc jsonb_path_ops);
РаÑÑмоÑÑим пÑÐ¸Ð¼ÐµÑ ÑаблиÑÑ, в коÑоÑой Ñ ÑанÑÑÑÑ Ð´Ð¾ÐºÑменÑÑ JSON, полÑÑаемÑе Ð¾Ñ ÑÑоÑонней веб-ÑлÑжбÑ, Ñ Ð´Ð¾ÐºÑменÑиÑованнÑм опÑеделением ÑÑ ÐµÐ¼Ñ. ТипиÑнÑй докÑменÑ:
{
"guid": "9c36adc1-7fb5-4d5b-83b4-90356a46061a",
"name": "Angela Barton",
"is_active": true,
"company": "Magnafone",
"address": "178 Howard Place, Gulf, Washington, 702",
"registered": "2009-11-07T08:53:22 +08:00",
"latitude": 19.793713,
"longitude": 86.513373,
"tags": [
"enim",
"aliquip",
"qui"
]
} ÐÑ ÑоÑ
ÑанÑем ÑÑи докÑменÑÑ Ð² ÑаблиÑе api, в ÑÑолбÑе jdoc Ñипа jsonb. ÐÑли по ÑÑÐ¾Ð¼Ñ ÑÑолбÑÑ ÑоздаÑÑÑÑ GIN-индекÑ, он Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑименÑÑÑÑÑ Ð² подобнÑÑ
запÑоÑаÑ
:
-- ÐайÑи докÑменÑÑ, в коÑоÑÑÑ
клÑÑ "company" Ð¸Ð¼ÐµÐµÑ Ð·Ð½Ð°Ñение "Magnafone"
SELECT jdoc->'guid', jdoc->'name' FROM api WHERE jdoc @> '{"company": "Magnafone"}'; Ðднако в ÑледÑÑÑиÑ
запÑоÑаÑ
он не бÑÐ´ÐµÑ Ð¸ÑполÑзоваÑÑÑÑ, поÑÐ¾Ð¼Ñ ÑÑо, неÑмоÑÑÑ Ð½Ð° Ñо, ÑÑо опеÑаÑÐ¾Ñ ? â индекÑиÑÑемÑй, он пÑименÑеÑÑÑ Ð½Ðµ к индекÑиÑÐ¾Ð²Ð°Ð½Ð½Ð¾Ð¼Ñ ÑÑолбÑÑ jdoc непоÑÑедÑÑвенно:
-- ÐайÑи докÑменÑÑ, в коÑоÑÑÑ ÐºÐ»ÑÑ "tags" ÑодеÑÐ¶Ð¸Ñ ÐºÐ»ÑÑ Ð¸Ð»Ð¸ ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð¼Ð°ÑÑива "qui" SELECT jdoc->'guid', jdoc->'name' FROM api WHERE jdoc -> 'tags' ? 'qui';
РвÑÑ Ð¶Ðµ, пÑавилÑно пÑименÑÑ Ð¸Ð½Ð´ÐµÐºÑÑ Ð²ÑÑажений, в ÑÑом запÑоÑе можно задейÑÑвоваÑÑ Ð¸Ð½Ð´ÐµÐºÑ. ÐÑли запÑÐ¾Ñ Ð¾Ð¿ÑеделÑннÑÑ
ÑлеменÑов в клÑÑе "tags" вÑполнÑеÑÑÑ ÑаÑÑо, веÑоÑÑно ÑÑÐ¾Ð¸Ñ Ð¾Ð¿ÑеделиÑÑ Ñакой индекÑ:
CREATE INDEX idxgintags ON api USING GIN ((jdoc -> 'tags'));
ТепеÑÑ Ð¿Ñедложение WHERE jdoc -> 'tags' ? 'qui' бÑÐ´ÐµÑ Ð²ÑполнÑÑÑÑÑ ÐºÐ°Ðº пÑименение индекÑиÑÑемого опеÑаÑоÑа ? к индекÑиÑÑÐµÐ¼Ð¾Ð¼Ñ Ð²ÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ jdoc -> 'tags'. (ÐодÑобнее об индекÑаÑ
вÑÑажений можно ÑзнаÑÑ Ð² Разделе 11.7.)
ÐÑÑ Ð¾Ð´Ð¸Ð½ Ð¿Ð¾Ð´Ñ Ð¾Ð´ к иÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¿ÑовеÑок на ÑÑÑеÑÑвование:
-- ÐайÑи докÑменÑÑ, в коÑоÑÑÑ
клÑÑ "tags" ÑодеÑÐ¶Ð¸Ñ ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð¼Ð°ÑÑива "qui"
SELECT jdoc->'guid', jdoc->'name' FROM api WHERE jdoc @> '{"tags": ["qui"]}'; ÐÑÐ¾Ñ Ð·Ð°Ð¿ÑÐ¾Ñ Ð¼Ð¾Ð¶ÐµÑ Ð·Ð°Ð´ÐµÐ¹ÑÑвоваÑÑ Ð¿ÑоÑÑой GIN-Ð¸Ð½Ð´ÐµÐºÑ Ð¿Ð¾ ÑÑолбÑÑ jdoc. Ðо замеÑÑÑе, ÑÑо Ñакой Ð¸Ð½Ð´ÐµÐºÑ Ð±ÑÐ´ÐµÑ Ñ
ÑаниÑÑ ÐºÐ¾Ð¿Ð¸Ð¸ вÑеÑ
клÑÑей и знаÑений в поле jdoc, Ñогда как Ð¸Ð½Ð´ÐµÐºÑ Ð²ÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð¸Ð· пÑедÑдÑÑего пÑимеÑа Ñ
ÑÐ°Ð½Ð¸Ñ ÑолÑко даннÑе внÑÑÑи обÑекÑа Ñ ÐºÐ»ÑÑом tags. ХоÑÑ Ð¿Ð¾Ð´Ñ
од Ñ Ð¿ÑоÑÑÑм индекÑом гоÑаздо более гибкий (Ñак как он поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ Ð·Ð°Ð¿ÑоÑÑ Ð¿Ð¾ лÑÐ±Ð¾Ð¼Ñ ÐºÐ»ÑÑÑ), индекÑÑ ÐºÐ¾Ð½ÐºÑеÑнÑÑ
вÑÑажений ÑкоÑее вÑего бÑдÑÑ Ð¼ÐµÐ½ÑÑе и бÑÑÑÑее, Ñем пÑоÑÑÑе индекÑÑ.
Также индекÑÑ GIN поддеÑживаÑÑ Ð¾Ð¿ÐµÑаÑоÑÑ @? и @@, коÑоÑÑе ÑопоÑÑавлÑÑÑ jsonpath Ñ Ð´Ð°Ð½Ð½Ñми. ÐÑимеÑÑ:
SELECT jdoc->'guid', jdoc->'name' FROM api WHERE jdoc @? '$.tags[*] ? (@ == "qui")';
SELECT jdoc->'guid', jdoc->'name' FROM api WHERE jdoc @@ '$.tags[*] == "qui"';
ÐÐ»Ñ ÑÑиÑ
опеÑаÑоÑов Ð¸Ð½Ð´ÐµÐºÑ GIN Ð¸Ð·Ð²Ð»ÐµÐºÐ°ÐµÑ Ð¸Ð· jsonpath пÑÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð²Ð¸Ð´Ð° ÑепоÑка_обÑаÑÐµÐ½Ð¸Ñ == конÑÑанÑа и вÑполнÑÐµÑ Ð¿Ð¾Ð¸Ñк по клÑÑам и знаÑениÑм из ÑÑиÑ
пÑедложений. ЦепоÑка обÑаÑÐµÐ½Ð¸Ñ Ð¼Ð¾Ð¶ÐµÑ Ð²ÐºÐ»ÑÑаÑÑ ÑÐºÐ°Ð·Ð°Ð½Ð¸Ñ Ð¾Ð±ÑаÑÐµÐ½Ð¸Ñ ., клÑÑ[*] и [. ÐлаÑÑ Ð¾Ð¿ÐµÑаÑоÑов индекÑ]jsonb_ops Ñакже поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ ÑÐºÐ°Ð·Ð°Ð½Ð¸Ñ .* и .**, коÑоÑÑе не поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ ÐºÐ»Ð°ÑÑ Ð¾Ð¿ÐµÑаÑоÑов jsonb_path_ops.
ÐлаÑÑ Ð¾Ð¿ÐµÑаÑоÑов jsonb_path_ops поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ ÑолÑко запÑоÑÑ Ñ Ð¾Ð¿ÐµÑаÑоÑами @>, @? и @@, но он знаÑиÑелÑно пÑоизводиÑелÑнее клаÑÑа по ÑмолÑÐ°Ð½Ð¸Ñ jsonb_ops. ÐÐ½Ð´ÐµÐºÑ jsonb_path_ops обÑÑно гоÑаздо менÑÑе индекÑа jsonb_ops Ð´Ð»Ñ ÑеÑ
же даннÑÑ
и более ÑоÑен пÑи поиÑке, оÑобенно еÑли запÑоÑÑ Ð¾Ð±ÑаÑаÑÑÑÑ Ðº клÑÑам, ÑаÑÑо вÑÑÑеÑаÑÑимÑÑ Ð² даннÑÑ
. Таким обÑазом, Ñ Ð½Ð¸Ð¼ опеÑаÑии поиÑка вÑполнÑÑÑÑÑ Ð³Ð¾Ñаздо ÑÑÑекÑивнее, Ñем Ñ ÐºÐ»Ð°ÑÑом опеÑаÑоÑов по ÑмолÑаниÑ.
ТеÑ
ниÑеÑкое ÑазлиÑие Ð¼ÐµÐ¶Ð´Ñ GIN-индекÑами jsonb_ops и jsonb_path_ops ÑоÑÑÐ¾Ð¸Ñ Ð² Ñом, ÑÑо Ð´Ð»Ñ Ð¿ÐµÑвÑÑ
ÑоздаÑÑÑÑ Ð½ÐµÐ·Ð°Ð²Ð¸ÑимÑе ÑлеменÑÑ Ð¸Ð½Ð´ÐµÐºÑа Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ клÑÑа/знаÑÐµÐ½Ð¸Ñ Ð² даннÑÑ
, Ñогда как Ð´Ð»Ñ Ð²ÑоÑÑÑ
ÑоздаÑÑÑÑ ÑлеменÑÑ ÑолÑко Ð´Ð»Ñ Ð·Ð½Ð°Ñений. [7] Ðо ÑÑÑи, каждÑй ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð¸Ð½Ð´ÐµÐºÑа jsonb_path_ops пÑедÑÑавлÑÐµÑ Ñобой Ñ
ÐµÑ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ð¸ клÑÑа(ей), пÑиводÑÑего к немÑ; напÑимеÑ, пÑи индекÑаÑии {"foo": {"bar": "baz"}} бÑÐ´ÐµÑ Ñоздан один ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð¸Ð½Ð´ÐµÐºÑа Ñ Ñ
еÑем, ÑаÑÑÑиÑаннÑм по вÑем ÑÑÑм знаÑениÑм: foo, bar и baz. Таким обÑазом, пÑовеÑка на вÑ
ождение ÑÑой ÑÑÑÑкÑÑÑÑ Ð±ÑÐ´ÐµÑ Ð¸ÑполÑзоваÑÑ ÐºÑайне ÑоÑнÑй поиÑк по индекÑÑ, но опÑеделиÑÑ, ÑвлÑеÑÑÑ Ð»Ð¸ foo клÑÑом, Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ Ñакого индекÑа нелÑзÑ. С дÑÑгой ÑÑоÑонÑ, Ð¸Ð½Ð´ÐµÐºÑ jsonb_ops ÑоздаÑÑ ÑÑи оÑделÑнÑÑ
ÑлеменÑа индекÑа, пÑедÑÑавлÑÑÑиÑ
foo, bar и baz по оÑделÑноÑÑи; Ð´Ð»Ñ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð¿ÑовеÑки на вÑ
ождение бÑдÑÑ Ð¿ÑовеÑÐµÐ½Ñ ÑÑÑоки ÑаблиÑÑ, ÑодеÑжаÑие вÑе ÑÑи ÑÑи знаÑениÑ. ХоÑÑ GIN-индекÑÑ Ð¿Ð¾Ð·Ð²Ð¾Ð»ÑÑÑ Ð²ÑÑиÑлиÑÑ AND доволÑно ÑÑÑекÑивно, Ñакой поиÑк вÑÑ Ð¶Ðµ бÑÐ´ÐµÑ Ð¼ÐµÐ½ÐµÐµ ÑоÑнÑм и более медленнÑм, Ñем ÑавнознаÑнÑй поиÑк Ñ jsonb_path_ops, оÑобенно еÑли лÑбое одно из ÑÑиÑ
ÑÑÑÑ
знаÑений ÑодеÑжиÑÑÑ Ð² болÑÑом колиÑеÑÑве ÑÑÑок.
ÐедоÑÑаÑок клаÑÑа jsonb_path_ops заклÑÑаеÑÑÑ Ð² Ñом, ÑÑо он не ÑÑиÑÑÐ²Ð°ÐµÑ Ð² индекÑе ÑÑÑÑкÑÑÑÑ JSON, не ÑодеÑжаÑие никакиÑ
знаÑений {"a": {}}. ÐÐ»Ñ Ð¿Ð¾Ð¸Ñка по докÑменÑам, ÑодеÑжаÑиÑ
Ñакие ÑÑÑÑкÑÑÑÑ, поÑÑебÑеÑÑÑ Ð²ÑполниÑÑ Ð¿Ð¾Ð»Ð½Ð¾Ðµ ÑканиÑование индекÑа, ÑÑо доволÑно долго, поÑÑÐ¾Ð¼Ñ jsonb_path_ops не оÑÐµÐ½Ñ Ð¿Ð¾Ð´Ñ
Ð¾Ð´Ð¸Ñ Ð´Ð»Ñ Ð¿Ñиложений, ÑаÑÑо вÑполнÑÑÑиÑ
Ñакие запÑоÑÑ.
Тип jsonb Ñакже поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ Ð¸Ð½Ð´ÐµÐºÑÑ btree и hash. Ðни полезнÑ, ÑолÑко еÑли ÑÑебÑеÑÑÑ Ð¿ÑовеÑÑÑÑ ÑавенÑÑво JSON-докÑменÑов в Ñелом. ÐоÑÑдок ÑоÑÑиÑовки btree Ð´Ð»Ñ Ñипа jsonb Ñедко Ð¸Ð¼ÐµÐµÑ Ð±Ð¾Ð»ÑÑое знаÑение, но Ð´Ð»Ñ Ð¿Ð¾Ð»Ð½Ð¾ÑÑ Ð¾Ð½ пÑиводиÑÑÑ Ð½Ð¸Ð¶Ðµ:
ÐбÑекÑ>ÐаÑÑив>ÐогиÑеÑкое знаÑение>ЧиÑло>СÑÑока>nullÐбÑÐµÐºÑ Ñ n паÑами>ÐбÑÐµÐºÑ Ñ n - 1 паÑамиÐаÑÑив Ñ n ÑлеменÑами>ÐаÑÑив Ñ n - 1 ÑлеменÑами
за иÑклÑÑением Ñого, ÑÑо (по иÑÑоÑиÑеÑким пÑиÑинам) пÑÑÑой маÑÑив веÑÑ
него ÑÑÐ¾Ð²Ð½Ñ ÑоÑÑиÑÑеÑÑÑ ÐºÐ°Ðº менÑÑий, Ñем null. ÐбÑекÑÑ Ñ ÑавнÑм колиÑеÑÑвом Ð¿Ð°Ñ ÑÑавниваÑÑÑÑ Ð² Ñаком поÑÑдке:
клÑÑ-1,знаÑение-1,клÑÑ-2...
ÐамеÑÑÑе, ÑÑо клÑÑи обÑекÑов ÑÑавниваÑÑÑÑ ÑоглаÑно поÑÑÐ´ÐºÑ Ð¿Ñи Ñ Ñанении; в ÑаÑÑноÑÑи, из-за Ñого, ÑÑо коÑоÑкие клÑÑи Ñ ÑанÑÑÑÑ Ð¿ÐµÑед длиннÑми, ÑезÑлÑÑаÑÑ Ð¼Ð¾Ð³ÑÑ Ð¾ÐºÐ°Ð·Ð°ÑÑÑÑ Ð½ÐµÑколÑко не инÑÑиÑивнÑми:
{ "aa": 1, "c": 1} > {"b": 1, "d": 1}ÐаÑÑÐ¸Ð²Ñ Ñ ÑавнÑм ÑиÑлом ÑлеменÑом ÑпоÑÑдоÑиваÑÑÑÑ Ð°Ð½Ð°Ð»Ð¾Ð³Ð¸Ñно:
ÑлеменÑ-1,ÑлеменÑ-2...
ÐÑимиÑивнÑе знаÑÐµÐ½Ð¸Ñ JSON ÑÑавниваÑÑÑÑ Ð¿Ð¾ Ñем же пÑавилам ÑÑавнениÑ, ÑÑо и нижележаÑие ÑÐ¸Ð¿Ñ Ð´Ð°Ð½Ð½ÑÑ PostgreSQL. СÑÑоки ÑÑавниваÑÑÑÑ Ñ ÑÑÑÑом поÑÑдка ÑоÑÑиÑовки по ÑмолÑÐ°Ð½Ð¸Ñ Ð² ÑекÑÑей базе даннÑÑ .
8.14.5. ÐбÑаÑение по индекÑÑ Ðº ÑлеменÑам jsonb #
Тип даннÑÑ
jsonb поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ Ð¸Ð·Ð²Ð»ÐµÑение и изменение ÑлеменÑов в ÑÑиле обÑаÑÐµÐ½Ð¸Ñ Ðº ÑлеменÑам маÑÑива. УказÑваÑÑ Ð½Ð° вложеннÑе знаÑÐµÐ½Ð¸Ñ Ð¼Ð¾Ð¶Ð½Ð¾, Ð·Ð°Ð´Ð°Ð²Ð°Ñ ÑепоÑÐºÑ Ð¾Ð±ÑаÑений к ÑлеменÑам, пÑи ÑÑом бÑдÑÑ Ð´ÐµÐ¹ÑÑвоваÑÑ Ð¿Ñавила иÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð°ÑгÑменÑа path ÑÑнкÑии jsonb_set. ÐÑли знаÑение jsonb ÑвлÑеÑÑÑ Ð¼Ð°ÑÑивом, ÑиÑловÑе индекÑÑ Ð½Ð°ÑинаÑÑÑÑ Ñ Ð½ÑлÑ, а оÑÑиÑаÑелÑнÑе ÑелÑе ÑиÑла оÑÑÑиÑÑваÑÑ ÑлеменÑÑ c конÑа маÑÑива к наÑалÑ. ÐбÑаÑÐµÐ½Ð¸Ñ Ðº ÑÑезам маÑÑивов не поддеÑживаÑÑÑÑ. РезÑлÑÑÐ°Ñ Ð¾Ð±ÑаÑÐµÐ½Ð¸Ñ Ð¿Ð¾ индекÑÑ Ð²Ñегда Ð¸Ð¼ÐµÐµÑ Ñип jsonb.
ÐÑполÑзÑÑ Ð¾Ð¿ÐµÑаÑÐ¸Ñ Ð¾Ð±ÑаÑÐµÐ½Ð¸Ñ Ð¿Ð¾ индекÑÑ Ð² пÑедложении SET опеÑаÑоÑа UPDATE, можно изменÑÑÑ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ jsonb. ÐÑÑÑ Ñакого обÑаÑÐµÐ½Ð¸Ñ Ð´Ð¾Ð»Ð¶ÐµÐ½ бÑÑÑ Â«Ð¿ÑоÑ
одимÑм» Ð´Ð»Ñ Ð²ÑеÑ
ÑказаннÑÑ
знаÑений, еÑли они ÑÑÑеÑÑвÑÑÑ. ÐапÑимеÑ, пÑÑÑ val['a']['b']['c'] можно пÑойÑи полноÑÑÑÑ Ð´Ð¾ c, еÑли val, val['a'] и val['a']['b'] â обÑекÑÑ. ÐÑли же знаÑение val['a'] или val['a']['b'] не опÑеделено, бÑÐ´ÐµÑ Ñоздан пÑÑÑой обÑекÑ, заполнÑемÑй по меÑе необÑ
одимоÑÑи. Ðднако, еÑли знаÑение ÑобÑÑвенно val или лÑбое из пÑомежÑÑоÑнÑÑ
знаÑений ÑÑÑеÑÑвÑÐµÑ Ð¸ ÑвлÑеÑÑÑ Ð½Ðµ обÑекÑом, а, напÑимеÑ, ÑÑÑокой, ÑиÑлом или ÑÑÑноÑÑÑÑ jsonb null, пÑойÑи ÑÑÐ¾Ñ Ð¿ÑÑÑ Ð½ÐµÐ²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾, поÑÑÐ¾Ð¼Ñ Ð²Ð¾Ð·Ð½Ð¸ÐºÐ°ÐµÑ Ð¾Ñибка и ÑÑанзакÑÐ¸Ñ Ð¿ÑеÑÑваеÑÑÑ.
ÐÑÐ¸Ð¼ÐµÑ ÑинÑакÑиÑа обÑаÑÐµÐ½Ð¸Ñ Ð¿Ð¾ индекÑÑ:
-- ÐзвлеÑÑ Ð·Ð½Ð°Ñение обÑекÑа по клÑÑÑ
SELECT ('{"a": 1}'::jsonb)['a'];
-- ÐзвлеÑÑ Ð·Ð½Ð°Ñение вложенного обÑекÑа по пÑÑи клÑÑа
SELECT ('{"a": {"b": {"c": 1}}}'::jsonb)['a']['b']['c'];
-- ÐзвлеÑÑ ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð¼Ð°ÑÑива по индекÑÑ
SELECT ('[1, "2", null]'::jsonb)[1];
-- ÐзмениÑÑ Ð·Ð½Ð°Ñение обÑекÑа по клÑÑÑ. ÐбÑаÑиÑе внимание на апоÑÑÑоÑÑ Ð²Ð¾ÐºÑÑг '1': пÑиÑваиваемое
-- знаÑение Ñакже должно бÑÑÑ Ñипа jsonb
UPDATE table_name SET jsonb_field['key'] = '1';
-- ÐÑо вÑÐ·Ð¾Ð²ÐµÑ Ð¾ÑибкÑ, еÑли jsonb_field['a']['b'] в какой-либо запиÑи ÑвлÑеÑÑÑ Ð½Ðµ обÑекÑом.
-- ÐапÑимеÑ, в {"a": 1} клÑÑÑ 'a' ÑооÑвеÑÑÑвÑÐµÑ ÑиÑловое знаÑение
-- клÑÑа 'а'.
UPDATE table_name SET jsonb_field['a']['b']['c'] = '1';
-- ÐÑÑилÑÑÑоваÑÑ Ð·Ð°Ð¿Ð¸Ñи пÑедложением WHERE Ñ Ð¾Ð±ÑаÑением по клÑÑÑ. ÐоÑколÑÐºÑ ÑезÑлÑÑаÑ
-- обÑаÑÐµÐ½Ð¸Ñ Ð¿Ð¾ клÑÑÑ Ð±ÑÐ´ÐµÑ Ð¸Ð¼ÐµÑÑ Ñип jsonb, Ñакой же Ñип должно имеÑÑ ÑÑавниваемое Ñ Ð½Ð¸Ð¼ знаÑение.
-- ÐвойнÑе кавÑÑки добавленÑ, ÑÑÐ¾Ð±Ñ ÑÑÑока "value" ÑÑала допÑÑÑимой ÑÑÑокой jsonb.
SELECT * FROM table_name WHERE jsonb_field['key'] = '"value"'; ÐÑиÑваивание jsonb пÑи обÑаÑении по индекÑÑ Ð² некоÑоÑÑÑ
оÑобÑÑ
ÑлÑÑаÑÑ
ÑабоÑÐ°ÐµÑ Ð½Ðµ Ñак, как Ñ ÑÑнкÑией jsonb_set. Ðогда иÑÑ
одное знаÑение jsonb â NULL, пÑиÑваивание пÑи обÑаÑении по клÑÑÑ Ð±ÑÐ´ÐµÑ ÑабоÑаÑÑ, как бÑдÑо ÑÑо знаÑение â пÑÑÑое знаÑение JSON (Ñипа маÑÑив или обÑекÑ, в завиÑимоÑÑи Ð¾Ñ Ñипа клÑÑа):
-- Там, где поле jsonb_field бÑло NULL, оно ÑÑÐ°Ð½ÐµÑ {"a": 1}
UPDATE table_name SET jsonb_field['a'] = '1';
-- Там, где поле jsonb_field бÑло NULL, оно ÑÑÐ°Ð½ÐµÑ [1]
UPDATE table_name SET jsonb_field[0] = '1'; ÐÑли Ð¸Ð½Ð´ÐµÐºÑ Ñказан Ð´Ð»Ñ Ð¼Ð°ÑÑива, ÑодеÑжаÑего недоÑÑаÑоÑно ÑлеменÑов, в него бÑдÑÑ Ð´Ð¾Ð±Ð°Ð²Ð»ÑÑÑÑÑ ÑлеменÑÑ Ñо знаÑением NULL до ÑеÑ
поÑ, пока Ð¸Ð½Ð´ÐµÐºÑ Ð½Ðµ ÑÑÐ°Ð½ÐµÑ Ð´Ð¾ÑÑижимÑм и пока не ÑÑÐ°Ð½ÐµÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ñм задаÑÑ Ð·Ð½Ð°Ñение.
-- Там, где поле jsonb_field бÑло [], оно ÑÑÐ°Ð½ÐµÑ [null, null, 2]; -- Ñам, где поле jsonb_field бÑло [0], оно ÑÑÐ°Ð½ÐµÑ [0, null, 2] UPDATE table_name SET jsonb_field[2] = '2';
ÐнаÑение jsonb бÑÐ´ÐµÑ Ð¿ÑинимаÑÑ Ð¿ÑиÑÐ²Ð°Ð¸Ð²Ð°Ð½Ð¸Ñ Ð¿Ð¾ неÑÑÑеÑÑвÑÑÑим пÑÑÑм, еÑли поÑледний ÑÑÑеÑÑвÑÑÑий ÑлеменÑ, коÑоÑÑй нÑжно пÑойÑи, â обÑÐµÐºÑ Ð¸Ð»Ð¸ маÑÑив, в завиÑимоÑÑи Ð¾Ñ ÑооÑвеÑÑÑвÑÑÑего клÑÑа (ÑлеменÑ, на коÑоÑÑй ÑказÑÐ²Ð°ÐµÑ Ð¿Ð¾Ñледний ÐºÐ¾Ð¼Ð¿Ð¾Ð½ÐµÐ½Ñ Ð¿ÑÑи, не пÑоÑ
одиÑÑÑ Ð¸ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð»ÑбÑм). ÐложеннÑе ÑÑÑÑкÑÑÑÑ Ð¼Ð°ÑÑивов и обÑекÑов бÑдÑÑ ÑÐ¾Ð·Ð´Ð°Ð½Ñ Ð¸ Ð´Ð»Ñ Ð¿ÐµÑвÑÑ
дополнÑÑÑÑ ÑлеменÑами null до нÑжной позиÑии (заданной в пÑÑи), в коÑоÑÑÑ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿Ð¾Ð¼ÐµÑено пÑиÑваиваемое знаÑение.
-- Там, где поле jsonb_field бÑло {}, оно ÑÑÐ°Ð½ÐµÑ {"a": [{"b": 1}]}
UPDATE table_name SET jsonb_field['a'][0]['b'] = '1';
-- Там, где поле jsonb_field бÑло [], оно ÑÑÐ°Ð½ÐµÑ [null, {"a": 1}]
UPDATE table_name SET jsonb_field[1]['a'] = '1';8.14.6. ТÑанÑÑоÑмаÑии #
ÐÐ»Ñ ÑазлиÑнÑÑ
пÑоÑедÑÑнÑÑ
ÑзÑков пÑедÑÑÐ°Ð²Ð»ÐµÐ½Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑе ÑаÑÑиÑениÑ, ÑеализÑÑÑие ÑÑанÑÑоÑмаÑии Ð´Ð»Ñ Ñипа jsonb.
РаÑÑиÑÐµÐ½Ð¸Ñ Ð´Ð»Ñ PL/Perl назÑваÑÑÑÑ jsonb_plperl и jsonb_plperlu. Ðогда они иÑполÑзÑÑÑÑÑ, знаÑÐµÐ½Ð¸Ñ jsonb оÑобÑажаÑÑÑÑ Ð² ÑооÑвеÑÑÑвÑÑÑие ÑÑÑÑкÑÑÑÑ Perl: маÑÑивÑ, Ñ
еÑи или ÑкалÑÑÑ.
РаÑÑиÑение Ð´Ð»Ñ PL/Python назÑваеÑÑÑ jsonb_plpython3u. Ðогда оно иÑполÑзÑеÑÑÑ, знаÑÐµÐ½Ð¸Ñ jsonb оÑобÑажаÑÑÑÑ Ð² ÑооÑвеÑÑÑвÑÑÑие ÑÑÑÑкÑÑÑÑ Python: ÑловаÑи, ÑпиÑки или ÑкалÑÑÑ.
Ðз ÑÑиÑ
ÑаÑÑиÑений «довеÑеннÑм» ÑÑиÑаеÑÑÑ jsonb_plperl, Ñо еÑÑÑ ÐµÐ³Ð¾ могÑÑ ÑÑÑанавливаÑÑ Ð¾Ð±ÑÑнÑе полÑзоваÑели, имеÑÑие пÑаво CREATE в ÑекÑÑей базе даннÑÑ
. ÐÑÑалÑнÑе ÑаÑÑиÑÐµÐ½Ð¸Ñ Ð¼Ð¾Ð³ÑÑ ÑÑÑанавливаÑÑ ÑолÑко ÑÑпеÑполÑзоваÑели.
8.14.7. Тип jsonpath #
Тип jsonpath пÑедназнаÑен Ð´Ð»Ñ ÑеализаÑии поддеÑжки ÑзÑка пÑÑей SQL/JSON в PostgreSQL, позволÑÑÑего ÑÑÑекÑивно вÑполнÑÑÑ Ð·Ð°Ð¿ÑоÑÑ Ðº даннÑм JSON. Ðн обеÑпеÑÐ¸Ð²Ð°ÐµÑ Ð´Ð²Ð¾Ð¸Ñное пÑедÑÑавление ÑазобÑанного вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð¿ÑÑи SQL/JSON, опÑеделÑÑÑего, какие ÑлеменÑÑ Ð´Ð¾Ð»Ð¶Ð½Ñ Ð¸Ð·Ð²Ð»ÐµÐºÐ°ÑÑÑÑ Ð¸Ð· даннÑÑ
JSON Ð´Ð»Ñ Ð´Ð°Ð»ÑнейÑей обÑабоÑки в ÑÑнкÑиÑÑ
SQL/JSON.
СеманÑика пÑедикаÑов и опеÑаÑоÑов ÑзÑка пÑÑей SQL/JSON в Ñелом ÑооÑвеÑÑÑвÑÐµÑ SQL. Ð Ñо же вÑемÑ, ÑÑÐ¾Ð±Ñ Ñ Ð´Ð°Ð½Ð½Ñми JSON можно бÑло опеÑиÑоваÑÑ ÐµÑÑеÑÑвеннÑм обÑазом, в ÑинÑакÑиÑе пÑÑей SQL/JSON пÑинÑÑÑ Ð½ÐµÐºÐ¾ÑоÑÑе ÑоглаÑÐµÐ½Ð¸Ñ JavaScript:
ТоÑка (
.) пÑименÑеÑÑÑ Ð´Ð»Ñ Ð´Ð¾ÑÑÑпа к ÑÐ»ÐµÐ½Ñ Ð¾Ð±ÑекÑа.ÐвадÑаÑнÑе Ñкобки (
[]) пÑименÑÑÑÑÑ Ð´Ð»Ñ Ð¾Ð±ÑаÑÐµÐ½Ð¸Ñ Ðº маÑÑивÑ.ÐлеменÑÑ Ð¼Ð°ÑÑивов в SQL/JSON нÑмеÑÑÑÑÑÑ Ñ 0, Ñогда как обÑÑнÑе маÑÑÐ¸Ð²Ñ SQL â Ñ 1.
ЧиÑловÑе конÑÑанÑÑ Ð² вÑÑажениÑÑ
пÑÑей SQL/JSON подÑинÑÑÑÑÑ Ð¿Ñавилам JavaScript, коÑоÑÑе оÑлиÑаÑÑÑÑ Ð¾Ñ SQL и JSON в некоÑоÑÑÑ
мелкиÑ
деÑалÑÑ
. ÐапÑимеÑ, пÑÑи SQL/JSON допÑÑкаÑÑ .1 и 1., коÑоÑÑе недопÑÑÑÐ¸Ð¼Ñ Ð² JSON. ÐоддеÑживаÑÑÑÑ Ð½ÐµÐ´ÐµÑÑÑиÑнÑе ÑелоÑиÑленнÑе конÑÑанÑÑ Ð¸ ÑазделиÑели-подÑÑÑкиваниÑ, напÑимеÑ, 1_000_000, 0x1EEE_FFFF, 0o273, 0b100101. РпÑÑÑÑ
SQL/JSON (и в JavaScript, но не в Ñамом SQL) не должно бÑÑÑ ÑазделиÑелÑ-подÑÑÑÐºÐ¸Ð²Ð°Ð½Ð¸Ñ Ð½ÐµÐ¿Ð¾ÑÑедÑÑвенно поÑле пÑеÑикÑа ÑиÑÑÐµÐ¼Ñ ÑÑиÑлениÑ.
ÐÑÑажение пÑÑи SQL/JSON обÑÑно запиÑÑваеÑÑÑ Ð² SQL-запÑоÑе в виде ÑимволÑной конÑÑанÑÑ SQL, и поÑÑÐ¾Ð¼Ñ Ð´Ð¾Ð»Ð¶Ð½Ð¾ заклÑÑаÑÑÑÑ Ð² апоÑÑÑоÑÑ, а лÑбой апоÑÑÑоÑ, коÑоÑÑй нÑжно заклÑÑиÑÑ Ð² ÑÑо знаÑение, должен дÑблиÑоваÑÑÑÑ (Ñм. ÐодÑаздел 4.1.2.1). ÐеÑедко ÑÑÑоковÑе конÑÑанÑÑ ÑÑебÑеÑÑÑ Ð¸ÑполÑзоваÑÑ Ð¸ внÑÑÑи вÑÑажений пÑÑей. Ðа Ñакие конÑÑанÑÑ ÑаÑпÑоÑÑÑанÑÑÑÑÑ ÑоглаÑÐµÐ½Ð¸Ñ JavaScript/ECMAScript: они Ð´Ð¾Ð»Ð¶Ð½Ñ Ð·Ð°ÐºÐ»ÑÑаÑÑÑÑ Ð² двойнÑе кавÑÑки, а Ð´Ð»Ñ Ð¿ÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ñимволов, коÑоÑÑе Ñложно ввеÑÑи инаÑе, иÑполÑзÑÑÑÑÑ ÑпеÑпоÑледоваÑелÑноÑÑи Ñ Ð¾Ð±ÑаÑной коÑой ÑеÑÑой. Ð ÑаÑÑноÑÑи, Ñимвол двойнÑÑ
кавÑÑек внÑÑÑи ÑÑÑоковой конÑÑанÑÑ Ð·Ð°Ð¿Ð¸ÑÑваеÑÑÑ ÐºÐ°Ðº \", а ÑобÑÑвенно обÑаÑÐ½Ð°Ñ ÐºÐ¾ÑÐ°Ñ ÑеÑÑа как \\. Ð ÑиÑло дÑÑгиÑ
ÑпеÑпоÑледоваÑелÑноÑÑей, воÑпÑинимаемÑÑ
в ÑÑÑокаÑ
JavaScript, вÑ
одÑÑ: \b, \f, \n, \r, \t, \v, вÑÑажаÑÑие ÑазлиÑнÑе ÑпÑавлÑÑÑие ÑÐ¸Ð¼Ð²Ð¾Ð»Ñ ASCII, \x, вÑÑажаÑÑÐ°Ñ Ñимвол кодом в виде ÑолÑко двÑÑ
ÑеÑÑнадÑаÑеÑиÑнÑÑ
ÑиÑÑ, NN\u, вÑÑажаÑÑÐ°Ñ Ñимвол Unicode кодом в виде ÑеÑÑÑÑÑ
ÑеÑÑнадÑаÑеÑиÑнÑÑ
ÑиÑÑ, а Ñакже NNNN\u{, позволÑÑÑÐ°Ñ Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñи кода Ñимвола Unicode иÑполÑзоваÑÑ Ð¾Ñ 1 до 6 ÑеÑÑнадÑаÑеÑиÑнÑÑ
ÑиÑÑ.N...}
ÐÑÑажение пÑÑи ÑоÑÑÐ¾Ð¸Ñ Ð¸Ð· поÑледоваÑелÑноÑÑи ÑлеменÑов пÑÑи, коÑоÑÑе могÑÑ Ð±ÑÑÑ ÑледÑÑÑими:
ÐонÑÑанÑÑ Ð¿ÑимиÑивнÑÑ Ñипов JSON: ÑекÑÑ Unicode, ÑиÑла и знаÑÐµÐ½Ð¸Ñ true, false и null.
ÐеÑеменнÑе пÑÑи пеÑеÑиÑÐ»ÐµÐ½Ñ Ð² ТаблиÑе 8.24.
ÐпеÑаÑоÑÑ Ð¾Ð±ÑаÑÐµÐ½Ð¸Ñ Ð¿ÐµÑеÑиÑÐ»ÐµÐ½Ñ Ð² ТаблиÑе 8.25.
ÐпеÑаÑоÑÑ Ð¸ меÑодÑ
jsonpathпеÑеÑиÑÐ»ÐµÐ½Ñ Ð² ÐодÑазделе 9.16.2.3.Скобки, пÑименÑÑÑиеÑÑ Ð´Ð»Ñ Ð¾Ð±ÑÐ°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð²ÑÑажений ÑилÑÑÑа и Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¿Ð¾ÑÑдка вÑÑиÑÐ»ÐµÐ½Ð¸Ñ Ð¿ÑÑи.
Ðолее подÑобно иÑполÑзование вÑÑажений jsonpath Ñ ÑÑнкÑиÑми запÑоÑов SQL/JSON опиÑано в ÐодÑазделе 9.16.2.
ТаблиÑа 8.24. ÐеÑеменнÑе jsonpath
| ÐеÑÐµÐ¼ÐµÐ½Ð½Ð°Ñ | ÐпиÑание |
|---|---|
$ | ÐеÑеменнаÑ, пÑедÑÑавлÑÑÑÐ°Ñ Ð·Ð½Ð°Ñение JSON, ÑигÑÑиÑÑÑÑее в запÑоÑе (ÑÐ»ÐµÐ¼ÐµÐ½Ñ ÐºÐ¾Ð½ÑекÑÑа). |
$varname | ÐÐ¼ÐµÐ½Ð¾Ð²Ð°Ð½Ð½Ð°Ñ Ð¿ÐµÑеменнаÑ. ÐÑ Ð·Ð½Ð°Ñение Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð·Ð°Ð´Ð°Ð½Ð¾ в паÑамеÑÑе vars, коÑоÑÑй пÑинимаÑÑ ÑазлиÑнÑе ÑÑнкÑии обÑабоÑки JSON; подÑобноÑÑи в ТаблиÑе 9.51. |
@ | ÐеÑеменнаÑ, пÑедÑÑавлÑÑÑÐ°Ñ ÑезÑлÑÑÐ°Ñ Ð²ÑÑиÑÐ»ÐµÐ½Ð¸Ñ Ð¿ÑÑи в вÑÑажениÑÑ ÑилÑÑÑов. |
ТаблиÑа 8.25. ÐпеÑаÑоÑÑ Ð¾Ð±ÑаÑÐµÐ½Ð¸Ñ Ð² jsonpath
| ÐпеÑаÑÐ¾Ñ Ð¾Ð±ÑаÑÐµÐ½Ð¸Ñ | ÐпиÑание |
|---|---|
| ÐпеÑаÑÐ¾Ñ Ð¾Ð±ÑаÑÐµÐ½Ð¸Ñ Ðº ÑÐ»ÐµÐ½Ñ Ð¾Ð±ÑекÑа, вÑбиÑÐ°ÐµÐ¼Ð¾Ð¼Ñ Ð¿Ð¾ Ð·Ð°Ð´Ð°Ð½Ð½Ð¾Ð¼Ñ ÐºÐ»ÑÑÑ. ÐÑли Ð¸Ð¼Ñ ÐºÐ»ÑÑа ÑÐ¾Ð²Ð¿Ð°Ð´Ð°ÐµÑ Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ какой-либо пеÑеменной, наÑинаÑÑимÑÑ Ñ |
| ÐпеÑаÑÐ¾Ñ Ð¾Ð±ÑаÑÐµÐ½Ð¸Ñ Ð¿Ð¾ звÑздоÑке, коÑоÑÑй возвÑаÑÐ°ÐµÑ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ð²ÑÐµÑ Ñленов, Ð½Ð°Ñ Ð¾Ð´ÑÑÐ¸Ñ ÑÑ Ð½Ð° веÑÑ Ð½ÐµÐ¼ ÑÑовне обÑекÑа. |
| РекÑÑÑивнÑй опеÑаÑÐ¾Ñ Ð¾Ð±ÑаÑÐµÐ½Ð¸Ñ Ð¿Ð¾ звÑздоÑке, коÑоÑÑй пÑÐ¾Ñ Ð¾Ð´Ð¸Ñ Ð¿Ð¾ вÑем ÑÑовнÑм иеÑаÑÑ Ð¸Ð¸ JSON ÑекÑÑего обÑекÑа и возвÑаÑÐ°ÐµÑ Ð²Ñе знаÑÐµÐ½Ð¸Ñ Ñленов, вне завиÑимоÑÑи Ð¾Ñ Ð¸Ñ ÑÑÐ¾Ð²Ð½Ñ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ð¾ÑÑи. ÐÑо Ñеализованное в PostgreSQL ÑаÑÑиÑение ÑÑандаÑÑа SQL/JSON. |
| ÐÑÐ¾Ñ Ð¾Ð¿ÐµÑаÑÐ¾Ñ Ð¿Ð¾Ð´Ð¾Ð±ÐµÐ½ |
| ÐпеÑаÑÐ¾Ñ Ð¾Ð±ÑаÑÐµÐ½Ð¸Ñ Ðº ÑлеменÑÑ Ð¼Ð°ÑÑива. ÐадаваемÑй |
| ÐпеÑаÑÐ¾Ñ Ð¾Ð±ÑаÑÐµÐ½Ð¸Ñ Ðº ÑлеменÑам маÑÑива по звÑздоÑке, возвÑаÑаÑÑий вÑе ÑлеменÑÑ Ð¼Ð°ÑÑива. |
[7] ÐоÑÑÐ¾Ð¼Ñ Ð¿Ð¾Ð½ÑÑие «знаÑение» вклÑÑÐ°ÐµÑ Ð¸ ÑлеменÑÑ Ð¼Ð°ÑÑивов, Ñ Ð¾ÑÑ Ð² ÑеÑминологии JSON иногда ÑлеменÑÑ Ð¼Ð°ÑÑивов ÑÑиÑаÑÑÑÑ Ð¾ÑлиÑнÑми Ð¾Ñ Ð·Ð½Ð°Ñений внÑÑÑи обÑекÑов.