วิธีสร้างดัชนีบนฟิลด์ JSON ใน Postgres


111

ใน PostgreSQL 9.3 Beta 2 (?) ฉันจะสร้างดัชนีบนฟิลด์ JSON ได้อย่างไร ฉันลองใช้ตัว->ดำเนินการที่ใช้hstoreแต่ได้รับข้อผิดพลาดต่อไปนี้:

 CREATE TABLE publishers(id INT, info JSON);
 CREATE INDEX ON publishers((info->'name'));

ข้อผิดพลาด: ประเภทข้อมูล json ไม่มีคลาสตัวดำเนินการเริ่มต้นสำหรับวิธีการเข้าถึง "btree" คำแนะนำ: คุณต้องระบุคลาสตัวดำเนินการสำหรับดัชนีหรือกำหนดคลาสตัวดำเนินการเริ่มต้นสำหรับชนิดข้อมูล


8
“ คำถามอยู่ไหน” - ในหัวข้อ
rlib

2
ในอนาคตโปรดดูที่stackoverflow.com/tags/postgresql/infoส่วน "ถามคำถามที่ดีกว่า" อาจช่วยให้ได้รับคำตอบที่ดีขึ้นเร็วขึ้นโดยมีคำถามที่น่ารำคาญน้อยลง
Craig Ringer

คำตอบ:


186

พบ:

CREATE TABLE publishers(id INT, info JSON); 
CREATE INDEX ON publishers((info->>'name'));

ตามที่ระบุไว้ในความคิดเห็นที่แตกต่างที่ลึกซึ้งที่นี่เป็นแทน->> ->ค่าเดิมส่งคืนค่าเป็นข้อความส่วนหลังเป็นออบเจ็กต์ JSON



39
ในกรณีที่คุณกำลังมองหาที่แตกต่างกัน: มันเป็นแทน->> ->ค่าเดิมส่งคืนค่าเป็นข้อความส่วนค่าหลังส่งคืนอ็อบเจ็กต์ JSON
Daniel Rikowski

35
วงเล็บคู่ก็มีความสำคัญเช่นกัน
รอน

11
@Jac_opo มันแยกพวกมันออกมาราวกับTEXTว่า ((info->>'name')::INT)หากคุณต้องการที่จะทำเปรียบเทียบจำนวนเต็มแทนของการเปรียบเทียบสตริงคุณจะต้องเพิ่มหล่อ:
jpmc26

13
หากคุณต้องการสร้างดัชนีบนฟิลด์ภายในวัตถุย่อยของคอลัมน์ JSON ของคุณขอบคุณ @DanielRikowski ฉันคิดว่าฉันต้องทำcreate index idx_name on table_name ((json_column->'child_obj'->>'child_obj_field'));ก่อนอื่นเราต้องใช้->เพื่อรับวัตถุ JSON จากนั้นจึง->>จะได้รับค่าวัตถุลูกเป็น ข้อความ
Corey Cole
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.