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.