2016-04-29 12 views
11

में किसी आइटम सूची की संबंधित आइटम सूची पुनर्प्राप्त करें मैं फ़ायरबेस में आइटम्स की एक सूची प्राप्त करना चाहता हूं, लेकिन आइटम के प्रत्येक तत्व में संबंधित आइटमों की एक सूची है। मैं सूची प्राप्त करने में सक्षम नहीं हूं, न तो firebase-util और न ही फायरबेस एरे $extend कार्यक्षमता का उपयोग कर रहा हूं।फ़ायरबेस एरे

मेरे firebase डेटा इस तरह दिखता है:

items 
    item1 
     name: "Item 1" 
     user: user1 
     images 
      image1: true 
      image2: true 
    item2 
     name: "Item 2" 
     user: user1 
     images: 
      image3: true 
      image4: true 
    item3 
     name: "Item 3" 
     user: user2 
     images: 
      image5: true 
      image6: true 

users 
    user1 
     name: "User 1" 
     email: "[email protected]" 
    user2 
     name: "User 2" 
     email: "[email protected]" 

images 
    image1 
     image: "data:image/jpeg;base64,/9j/..." 
     thumb: "data:image/jpeg;base64,/9j/..." 
    image2 
     image: "data:image/jpeg;base64,/9j/..." 
     thumb: "data:image/jpeg;base64,/9j/..." 
    image3 
     image: "data:image/jpeg;base64,/9j/..." 
     thumb: "data:image/jpeg;base64,/9j/..." 
    image4 
     image: "data:image/jpeg;base64,/9j/..." 
     thumb: "data:image/jpeg;base64,/9j/..." 
    image5 
     image: "data:image/jpeg;base64,/9j/..." 
     thumb: "data:image/jpeg;base64,/9j/..." 

और मैं सिर्फ सभी डेटा के साथ मदों की एक सूची प्राप्त करना चाहते हैं। कुछ ऐसा:

items 
    item1 
     name: "Item 1" 
     user 
      name: "User 1" 
      email: "[email protected]" 
     images 
      image1 
       image: "data:image/jpeg;base64,/9j/..." 
       thumb: "data:image/jpeg;base64,/9j/..." 
      image2 
       image: "data:image/jpeg;base64,/9j/..." 
       thumb: "data:image/jpeg;base64,/9j/..." 
    item2 
     name: "Item 2" 
     user 
      name: "User 1" 
      email: "[email protected]" 
     images 
      image3 
       image: "data:image/jpeg;base64,/9j/..." 
       thumb: "data:image/jpeg;base64,/9j/..." 
      image4 
       image: "data:image/jpeg;base64,/9j/..." 
       thumb: "data:image/jpeg;base64,/9j/..." 
    item3 
     name: "Item 3" 
     user 
      name: "User 2" 
      email: "[email protected]" 
     images 
      image5 
       image: "data:image/jpeg;base64,/9j/..." 
       thumb: "data:image/jpeg;base64,/9j/..." 
      image6 
       image: "data:image/jpeg;base64,/9j/..." 
       thumb: "data:image/jpeg;base64,/9j/..." 

यह काफी आम उपयोग केस जैसा दिखता है, लेकिन मैं यहां फंस गया हूं। मैंने this समाधान (दोनों तरीकों से) की कोशिश की है लेकिन मैं इसे काम नहीं कर सका। डेटा संरचना भी थोड़ी अलग है क्योंकि मुझे किसी अन्य सूची के अंदर एक सूची को जोड़ने की आवश्यकता है।

+0

यह है के रूप में, आप प्रारूप आप के आधार पर के लिए पूछ रहे हैं में डेटा प्राप्त नहीं कर सकते हैं अपने वर्तमान संरचना। क्या आप जानकारी प्रदान कर सकते हैं कि आप एक ही समय में उस डेटा को क्यों प्राप्त करना चाहते हैं? आम तौर पर आपको उपयोगकर्ता नामों की एक सूची, या छवियों की एक सूची मिल जाएगी जो आइटम 3 के साथ जाती है लेकिन आम तौर पर सभी एक साथ नहीं। मुझे लगता है कि आपके प्रश्न का समाधान हो सकता है और उपयोग के मामले को समझने में मदद मिलेगी। – Jay

+0

@Jay मैं एक आइटम सूची दिखाना चाहता हूं। प्रत्येक आइटम में छवियों की एक सूची होती है, लेकिन मैं आइटम में से एक की मुख्य तस्वीर के रूप में सूची में से एक को दिखाऊंगा। और क्यों नहीं, शायद माउसओवर पर मैं दूसरे में बदलना चाहता हूं। लेकिन कम से कम अगर मैं इसे सिर्फ एक के साथ कर सकता हूं तो यह अच्छा होगा। – cor

उत्तर

2

धन्यवाद, वे बहुत मददगार रहे हैं, मेरे समाधान दोनों का एक सा है। मैं समझाऊंगा कि मैंने इसे कैसे समझ लिया है।

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

items 
    item1 
     name: "Item 1" 
     user: user1 
     cover: image1 
     images 
      image1: true 
      image2: true 
    item2 
     name: "Item 2" 
     user: user1 
     cover: image3 
     images: 
      image3: true 
      image4: true 
    item3 
     name: "Item 3" 
     user: user2 
     cover: image5 
     images: 
      image5: true 
      image6: true 

फिर, यह है कि मैं कितना सूची ऊपर उल्लेख किया है (async लाइब्रेरी का उपयोग कर) मिलता है: तो यहाँ नया items स्कीमा है। यह पूरा करने के लिए एक बेहतर तरीका हो सकता है एक ही:

getItems: function(cb){ 
    var items = ref.child("items"); 
    items.on("value", function(snapshot){ 

     var item_length = snapshot.numChildren(), 
      final_items = [], 
      readed = 0; 

     ref.child("items").on("child_added", function(item){ 

      var item_id = item.key(), 
       itemData = item.val(), 

       user = ref.child("users").child(itemData.user), 
       cover = ref.child("images").child(itemData.cover), 
       images = new Firebase.util.NormalizedCollection(
         [ref.child("items").child(item_id).child("images"),'alertImages'], 
         ref.child('images') 
       ).select('images.image','images.thumb').ref(); 

       async.parallel([ 
        function(callback){ 
         user.on("value", function(user_snap){ 
          callback(null, user_snap.val()); 
         }); 
        }, 
        function(callback){ 
         images.on("value", function(images_snap){ 
          callback(null, images_snap.val()); 
         }); 
        }, 
        function(callback){ 
         cover.on("value", function(cover_snap){ 
          callback(null, cover_snap.val()); 
         }); 
        } 
       ], function(err, results){ 
        if(!!err){ 
         cb(err,null) 
        }else{ 
         itemData.user = results[0]; 
         itemData.images = results[1]; 
         itemData.cover = results[2]; 

         final_items.push(itemData); 
         readed += 1; 
         if(readed === item_length){ 
          cb(null,final_items); 
         } 
        } 
       }); 
     }); 
    }); 
} 

और की तरह इस वसीयत उत्पादन कुछ:

item1 
    name: "Item 1" 
    cover: 
     image: "data:image/jpeg;base64,/9j/..." 
     thumb: "data:image/jpeg;base64,/9j/..." 
    user 
     name: "User 1" 
     email: "[email protected]" 
    images 
     image1 
      image: "data:image/jpeg;base64,/9j/..." 
      thumb: "data:image/jpeg;base64,/9j/..." 
     image2 
      image: "data:image/jpeg;base64,/9j/..." 
      thumb: "data:image/jpeg;base64,/9j/..." 
item2 
    name: "Item 2" 
    cover: 
     image: "data:image/jpeg;base64,/9j/..." 
     thumb: "data:image/jpeg;base64,/9j/..." 
    user 
     name: "User 1" 
     email: "[email protected]" 
    images 
     image3 
      image: "data:image/jpeg;base64,/9j/..." 
      thumb: "data:image/jpeg;base64,/9j/..." 
     image4 
      image: "data:image/jpeg;base64,/9j/..." 
      thumb: "data:image/jpeg;base64,/9j/..." 
item3 
    name: "Item 3" 
    cover: 
     image: "data:image/jpeg;base64,/9j/..." 
     thumb: "data:image/jpeg;base64,/9j/..." 
    user 
     name: "User 2" 
     email: "[email protected]" 
    images 
     image5 
      image: "data:image/jpeg;base64,/9j/..." 
      thumb: "data:image/jpeg;base64,/9j/..." 
     image6 
      image: "data:image/jpeg;base64,/9j/..." 
      thumb: "data:image/jpeg;base64,/9j/..." 
+0

प्राप्त करने के लिए उपयोगी था, आपको खुशी है कि आपके पास समाधान है। अन्य एसिंक्रोनस कॉल के अंदर उन असीमित कॉल पर नजर रखें। इससे आपको परेशानी हो सकती है, इसलिए मैं अक्सर आपके डेटा की जांच करूंगा - खासकर पुश() के साथ और लगभग एक ही समय में डेटा पढ़ने/लिखने वाले कई उपकरणों पर परीक्षण। – Jay

+0

सलाह @ जे के लिए धन्यवाद, मैं कोड कोड की तरह ही जवाब में कुछ कोड ढूंढ रहा था। फिलहाल मुझे कुछ भी बेहतर नहीं मिला है। हालांकि मैं कोशिश करूँगा – cor

4

उद्देश्य आइटम सूची दिखाने का उद्देश्य है।

प्रत्येक आइटम में छवियों की एक सूची है।

प्रारंभ में, प्रत्येक आइटम के लिए आइटम सूची और छवियों में से एक दिखाएं।

सुझाई दृष्टिकोण:

वस्तुओं और अपने शुरुआती थंबनेल की सूची को पॉप्युलेट करने के लिए, हम एक अलग नोड है कि हम से प्रारंभिक सेटअप खींच की आवश्यकता है।

item_list_for_ui 
    random_node_0 
    item_id: "item_id_aa" 
    name: "Item 1" //if you want to display the name in the list 
    initial_thumb: "data:image/jpeg;base64,/9j/..." //initial thumb 
    link_to: "image1" 
    random_node_1 
    item_id: "item_id_xx" 
    name: "Item 2" 
    initial_thumb: "data:image/jpeg;base64,/9j/..." 
    link_to: "image3" 
    random_node_2 
    item_id: "item_id_qq" 
    name: "Item 3" 
    initial_thumb: "data:image/jpeg;base64,/9j/..." 
    link_to: "image1" 

एप्लिकेशन शुरू होता है, पॉप्युलेट:

अपडेट किए गए आइटम नोड

items: 
    item_id_xx: //this should be a Firebase generated node name 
    name: "Item 2" 
    user: "uid_for_user_1" 
    images: 
    image3: "data:image/jpeg;base64,/9j/..." 
    image4: "data:image/jpeg;base64,/9j/..." 

यहां मुख्य सूची के लिए इस्तेमाल किया नोड जहाँ उपयोगकर्ता एक आइटम अंगूठे पर क्लिक कर सकते हैं और अधिक विस्तार पाने के लिए है items_list_for_ui नोड से सूची।

नोड उथला है और इसमें फ़ायरबेस आइटम_आईडी है, आइटम का नाम (यदि आवश्यक हो), प्रारंभिक छवि थंबनेल प्राप्त करने के लिए लिंक, और फायरबेस में मुख्य छवि का link_to शामिल है।

उदाहरण के लिए: उपयोगकर्ता आइटम 2 के लिए थंबनेल क्लिक करता है, आइटम विवरण में .Value साथ observeSingleEvent द्वारा लोड किया जा सकता

/आइटम/item_id_xx/images/Image3

आप इस पर व्याख्या कर सकता है item_list_for_ui

random_node_1 
    item_id: "item_id_xx" 
    name: "Item 2" 
    initial_thumb: "data:image/jpeg;base64,/9j/..." 
    thumb_link: "image3" 
    rollover_thumb: "external link to rollover" 
    rollover_link: "image4" 

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

यह भी कुशल है क्योंकि यह सैकड़ों आइटम और सैकड़ों बच्चे छवि नोड्स लोड करने से बचाता है - उन सभी नोड्स और बाल नोड्स को लोड करना ui (कुछ मामलों में) को अधिभारित करेगा।

इस संरचना के साथ, item_list_for_ui सैकड़ों आइटमों के साथ भी कॉम्पैक्ट है, यह उस डेटा का एक छोटा सबसेट है।

आप शायद अपने आप को स्वयं कह रहे हैं, यह डुप्लिकेट डेटा है।हां, यह है, और फायरबेस में डेटा डुप्लिकेट करना एक सामान्य प्रक्रिया है और प्रोत्साहित किया जाता है: यह संरचना को चापलूसी रखता है और प्रश्न बनाता है और डेटा के साथ बहुत तेजी से काम करता है।

अधिक पढ़ने के लिए देखें Denormalizing Data Keeps Your Breath Minty Fresh

+0

उत्तर @Jay के लिए धन्यवाद। लेकिन आप डेटा में कैसे शामिल होंगे? क्या आप 'फायरबेस-यूज' प्लगइन का उपयोग करेंगे? यदि हां, तो कैसे? मुझे नहीं पता कि आइटम आईडी गतिशील होने के बाद से संबंध कैसे करें – cor

+0

@cor फ़ायरबेस में कोई फ़ंक्शन नहीं है क्योंकि यह SQL नहीं है। डेटा को जोड़ने और डेटा को डुप्लिकेट करने के कई तरीके फ़ायरबेस में करना ठीक है। मुझे लगता है कि मेरे जवाब ने आपके प्रत्यक्ष प्रश्न का उत्तर दिया। आपकी टिप्पणी/अनुवर्ती एक महान नया प्रश्न है (और कुछ ऐसे उत्तर हैं जो इसे पहले से ही स्टैक ओवरफ्लो पर संबोधित करते हैं)। उन उत्तरों को देखें और यदि आपके पास कोई विशिष्ट प्रश्न है, तो इसे पोस्ट करें! – Jay

+0

क्षमा करें, आप सही हैं – cor

2

आप अपने चित्रों के माध्यम से कि सभी डेटा उपलब्ध आप पाश कर सकता है और डेटाबेस के बाकी के भीतर कुंजी के रूप में अपने मेटाडाटा का उपयोग करते हैं।

var itemsArr = []; 
    for(var i in items) { 
     var item = items[i]; 
     var images = []; 
     for(var image in item[images]) { 
      item.push(images[image]); 
     } 
     itemsArr.push({ 
      name: item.name, 
      user: users[item.user], 
      images: images 
     }); 
    } 

कौन इस तरह की तलाश में ऑब्जेक्ट की श्रृंखला उपज चाहिए: जवाब के लिए @Jay और @Eric को

{ 
    name: "Item 1", 
    user: { 
     name: "User 1", 
     email: "[email protected]" 
    }, 
    images: [{ 
      image: "data:image/jpeg;base64,/9j/..." 
      thumb: "data:image/jpeg;base64,/9j/..." 
     },{ 
      image: "data:image/jpeg;base64,/9j/..." 
      thumb: "data:image/jpeg;base64,/9j/..." 
    }] 
} 
+0

बहुत धन्यवाद @Eric N, आपका उत्तर – cor