Postgres में JSON फ़ील्ड पर इंडेक्स कैसे बनाएं?


111

PostgreSQL 9.3 बीटा 2 (?) में, मैं JSON फ़ील्ड पर एक इंडेक्स कैसे बना सकता हूं? मैंने इसके लिए उपयोग किए गए ->ऑपरेटर का उपयोग करने की कोशिश की , hstoreलेकिन निम्नलिखित त्रुटि मिली:

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

त्रुटि: डेटा टाइप जसन में एक्सेस विधि "बीटीआरआई" के लिए कोई डिफ़ॉल्ट ऑपरेटर वर्ग नहीं है: आपको सूचकांक के लिए एक ऑपरेटर वर्ग निर्दिष्ट करना होगा या डेटा प्रकार के लिए डिफ़ॉल्ट ऑपरेटर वर्ग को परिभाषित करना होगा।


8
"सवाल कहाँ है?" - शीर्षक में
rlib

2
भविष्य में, कृपया stackoverflow.com/tags/postgresql/info पर "बेहतर प्रश्न पूछें" अनुभाग देखें। यह कम कष्टप्रद सवालों के साथ जल्द ही बेहतर जवाब पाने में मदद कर सकता है।
क्रेग रिंगर

जवाबों:


186

मिल गया:

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

जैसा कि टिप्पणियों में कहा गया है, यहां सूक्ष्म अंतर ->>इसके बजाय है ->। पहले वाला पाठ के रूप में मान लौटाता है, बाद में JSON ऑब्जेक्ट के रूप में।



39
बस मामले में आप अंतर की तलाश में हैं: यह ->>इसके बजाय है ->। पूर्व वाला पाठ के रूप में मान लौटाता है, बाद वाला एक JSON ऑब्जेक्ट देता है।
डैनियल रिकोस्की

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 ऑब्जेक्ट ->>प्राप्त करने और फिर बच्चे का मान प्राप्त करने के लिए उपयोग करने की आवश्यकता है पाठ।
कोरी कोल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.