2013-06-26 3 views
5

से मेल खाने वाली कुंजियों के लिए फायरबेस को कैसे क्वेरी करें, क्योंकि फ़ायरबेस किसी भी स्थानिक इंडेक्सिंग का समर्थन नहीं करता है, इसलिए मैं भूहाश का उपयोग करता हूं जो कोई यहां सलाह देता है। जिओहाश पास के खोजने के लिए अक्षर का उपयोग कर रहा है।एक स्ट्रिंग उपसर्ग

तो कहते हैं कि मैं firebase में w22qt4vhye1cw99qt4vdf4vcw22qt4vhzerct geohash दुकान है और मैं केवल क्वेरी करने के लिए जो w22qt4 के करीब geohash चाहते हैं।

यह कैसे करें?

मुझे पता है कि फायरबेस शुरू हो गया है। मैंने कोशिश की लेकिन काम नहीं किया।

अद्यतन

भंडारण geohash firebase को

//Encode lat lng, result w22qt4vhye1c3 
var geoHashLatLng = encodeGeoHash(lat,lng); 
firebaseRef.child('/geohash/' + geoHashLatLng).set(id); 

json

root 
    - geohash 
     - w22qt4vhye1c3 
     - id 
     - z99qt4vdf4vc 
     - w22qt4vhzerct 

यहाँ मेरा प्रश्न में तो। मैं बस geohash से पूछना चाहता हूं जो अक्षर w22qt4 से शुरू होता है। क्या हम इसे फायरबेस में कर सकते हैं?

अद्यतन 2 startAt() लगता है क्वेरी नहीं के साथ पात्रों के साथ ...

उदाहरण शुरू: मैं gehash

geohash नोड

geohash 
    - a123 
    - a333 
    - b123 
    - c123 
    - d123 

निम्नलिखित कोड के साथ निम्नलिखित है

var firebaseRef = new Firebase('https://test.firebaseio.com'); 
var query = firebaseRef.child('/geohash').startAt(null, 'a'); 
query.on('child_added', function(snapshot) { 
    console.log(snapshot.name()); 
}); 

इस परिणाम

startAt(null, 'a') //return a123, a333, b123, c123, d123 
startAt(null, 'c123') //return c123, d123 
startAt(null, 'd') //return d123 

मेरे अपेक्षित परिणाम

startAt(null, 'a') //return a123, a333 
startAt(null, 'c123') //return c123 
startAt(null, 'd') //return d123 

मेरा अनुमान है, startAt() अनुक्रम में लेकिन मिलान नहीं 26 वर्णमाला पत्र क्वेरी करेगा हो जाएगा। तो, मैं फायरबेस में क्या कर सकता हूं ताकि मैं ऊपर दिए गए मेरे अपेक्षित परिणाम प्राप्त कर सकूं?

+0

क्या आप जो भी कोशिश कर रहे हैं उसका एक कोड स्निपेट प्रदान कर सकते हैं ताकि मैं अधिक सार्थक प्रतिक्रिया प्रदान कर सकूं? –

+0

@AndrewLee हाय, मैंने अभी अपना प्रश्न अपडेट किया है, कृपया एक नज़र डालें। – vzhen

+0

आप किसी विशेष कुंजी पर समाप्त होने के लिए "endAt" का उपयोग कर सकते हैं। नीचे मेरी पोस्ट में संपादन देखें। –

उत्तर

5

ऊपर एंड्रयू जवाब है, आप geohashes साथ वांछित प्रभाव प्राप्त करने के लिए क्या करना चाहते हैं क्या करने के अलावा (यानी उपसर्ग प्रश्नों आप विशेष रूप से 'जिज्ञासा' में सटीकता निर्दिष्ट करते हैं, करते हैं कि करने में सक्षम हो, उदाहरण के लिए भूहाश में हर 3 वर्ण आपको ~ +80 किमी) प्राप्त करते हैं, डेटा को अधिक बारीक और विघटित तरीके से स्टोर करना है।

तो, अब आप इसे कैसे संग्रहीत कर रहे हैं, इसके बजाय, आप डेटा को भौगोलिक स्ट्रिंग कुंजी को टुकड़ों में बदलकर सहेजना चाहते हैं (मैंने इसे 3 वर्ण सीमा पर किया है, लेकिन आपको उपयुक्त चुनना चाहिए tokenization रणनीति है कि आप वांछित सटीकता देता है) और एक बच्चे नाम के रूप में प्रत्येक खंड का उपयोग करें, जैसे:

root 
    - geohash 
     - w22 
     - qt4 
      - vhy 
      - e1c 
       - w22qt4vhye1c3 
       - id 
      - vhz 
      - erc 
       - w22qt4vhzerct 
       - id 
     - z99 
      - qt4 
      - vdf 
       - z99qt4vdf4vc 
       - id 

फिर, अपने प्रश्न, जब आप सभी geohashes कि w22qt4 के साथ शुरू आप एक करना होगा प्राप्त करने की आवश्यकता के रूप में के खिलाफ पूछताछ:

firebaseRef.child('/geohash/w22/qt4/') 

जो आपको vhy और vhz बच्चों को देगा, जिनके पास आपकी रुचि रखने वाले सभी वास्तविक भूगोल हैं।

+0

मैं कैसे पूछूं कि उप-बच्चे के अंतर्गत मूल्य कहां है? मैंने फायरबेस डॉक्स को पढ़ा। मैंने 'हैचल्ड्रेन()' और 'के लिए प्रत्येक() 'पाया। क्या सही चीजों का उपयोग करना है? वैसे, क्या मैं कोणीय आग में उपयोग कर सकता हूँ? क्योंकि मैं angularjs के साथ firebase का उपयोग कर रहा हूँ। – vzhen

+0

चूंकि डेटा को दिए गए तरीके से denormalized किया गया है, तो आपको फायरबेस प्रश्नों को लागू करने की आवश्यकता नहीं होगी। आप श्रोताओं को पेड़ में उचित स्तर पर संलग्न कर सकते हैं और यह वापस आने वाले स्नैपशॉट में सभी उप-बच्चों को वापस कर देगा। – Vikrum

2

आप सामान्य कुंजी का उपयोग कर निर्दिष्ट कुंजी के पास कुंजी खोजने के लिए क्वेरी कर सकते हैं। उदाहरण के लिए, इस मामले में आप चाहते हैं:

var query = firebaseRef.child("geohash").startAt(null, 'c').limit(5); 
query.on("child_added", ...); 

यह जब lexigraphically अनुसार क्रमबद्ध geoHashLatLng के बाद 5 तत्वों आप दे देंगे।

यदि आप कुछ निर्दिष्ट कुंजी पर अपनी क्वेरी समाप्त करना चाहते हैं, तो आप भी ऐसा कर सकते हैं। उदाहरण के लिए:

var query = firebaseRef.child("geohash").startAt(null, 'c').endAt('d'); 
+0

यह मुझे प्राप्त नहीं होता है, मैंने फिर से अपना प्रश्न अपडेट किया। मुझे लगता है कि इस बार और अधिक स्पष्ट है। कृपया यह देखें। धन्यवाद – vzhen

+0

क्षमा करें, मैं उल्लेख करना भूल गया कि मुझे नहीं पता कि अंत क्या है। मैंने एक पहेली जोड़ा। कृपया देखें http://plnkr.co/edit/Wtkq4978r1a4dnSLl9qi?p=preview – vzhen

+0

हमारे पास उपसर्ग द्वारा क्वेरी करने का कोई तरीका नहीं है। आपको यह पता लगाने की आवश्यकता है कि क्वेरी कहां समाप्त होनी चाहिए। हम चीजों को लिखित रूप से व्यवस्थित करते हैं, इसलिए यदि आप सी * चाहते थे, तो आप शुरू कर सकते हैं और अंत में डी, और फिर किसी भी मैच को ठीक से फेंक दें। –

संबंधित मुद्दे