database - फायरस्टोर में नेस्टेड एकल प्रश्नों के साथ काम करना



firebase nosql (1)

हाल ही में मैंने अपना डेटा मॉडल फायरबेस से फायरस्टोर तक ले जाया। मेरा पूरा कोड काम कर रहा है, लेकिन मुझे कुछ डेटा पुनर्प्राप्त करने के लिए मेरे घोंसले हुए प्रश्नों के बारे में कुछ बदसूरत परेशानी हो रही है। यहां बिंदु है:

अभी इस भाग के लिए मेरा डेटा मॉडल इस तरह दिखता है (हाँ! एक और अनुयायी / फ़ीड उदाहरण):

{
  "Users": { //Collection
    "UserId1" : { //Document
      "Feed" : { //Subcollection of Id of posts from users this user Follow
        "PostId1" : { //Document
          "timeStamp" : "SomeDate"
        },
        "PostId2" : {
          "timeStamp" : "SomeDate"
        },
        "PostId3" : {
          "timeStamp" : "SomeDate"
        }
      }
      //Some data
    }
  },
  "Posts":{ //Collection
    "PostId1":{ //Document
      "Comments" :{ //Subcollection
        "commentId" : { //Document
          "authorId": "UserId1"
          //comentsData
        }
      },
      "Likes" : { //Subcollection
        "UserId1" : { //Document
          "liked" : true
        }       
      }
    }
  }
}

मेरी समस्या यह है कि किसी उपयोगकर्ता की फ़ीड के पदों को पुनर्प्राप्त करने के लिए मुझे अगली तरीके से पूछना चाहिए:

  • मेरे फ़ीड से टाइमस्टैम्प द्वारा अंतिम एक्स दस्तावेज़ orderer प्राप्त करें

feedCol(userId).orderBy(CREATION_DATE, Query.Direction.DESCENDING).limit(limit)

  • इसके बाद मुझे सूची से पुनर्प्राप्त प्रत्येक पोस्ट की एक क्वेरी करना चाहिए: workoutPostCol.document(postId)

  • अब मेरे पास प्रत्येक पोस्ट का डेटा है, लेकिन मैं लेखक के उपयोगकर्ता नाम, चित्र, अंक .. आदि को गोली authorId चाहता हूं, जो एक अलग Document , इसलिए, मुझे प्रत्येक authorId लिए एक और एकल क्वेरी करना चाहिए authorId की सूची में पुनर्प्राप्त पोस्ट userSocial(userId).document(toId)

  • अंत में, और कम महत्वपूर्ण नहीं, मुझे यह जानने की ज़रूरत है कि मेरे वर्तमान उपयोगकर्ता को पहले से ही वह पोस्ट पसंद आया है, इसलिए मुझे प्रत्येक पोस्ट (दोबारा) के लिए एक ही प्रश्न करने की आवश्यकता है और जांचें कि मेरा उपयोगकर्ता आईडी posts/likes/{userId}

अभी सबकुछ काम कर रहा है, लेकिन सोच रहा है कि Firestore की कीमत डेटाबेस कॉल की संख्या के आधार पर है, और यह भी कि यह मेरे प्रश्नों को और अधिक सरल नहीं बनाता है, मुझे नहीं पता कि यह मेरा डेटा मॉडल अच्छा नहीं है इस तरह के डेटाबेस के लिए और मुझे सामान्य SQL जाना चाहिए या फिर Firebase फिर से जाना चाहिए।

नोट : मुझे पता है कि सबकुछ, मेरे उपयोगकर्ता या पोस्ट दस्तावेजों के अंदर सरणीसूची के लिए पसंद, फ़ीड इत्यादि के उप-चयनों को और अधिक आसान बनाना होगा, लेकिन दस्तावेज़ की सीमा 1 एमबी है और यदि यह बहुत बढ़ती है, तो यह क्रैश हो जाएगी भविष्य। दूसरी तरफ Firestore whereEqualTo दस्तावेज प्रश्नों (अभी तक) या एक OR क्लॉज को एकाधिक whereEqualTo का उपयोग करने की अनुमति नहीं देता है।

मैंने उन उपयोगकर्ताओं से बहुत सी पोस्ट पढ़ी हैं जिनके पास इस तरह के ID's रिश्तों को अपने Collections में joins और queries बनाने के लिए एक आसान तरीका तलाशने में समस्याएं हैं, Arraylists उपयोग करना बहुत ही अच्छा होगा, लेकिन 1 एमबी की सीमा इसे बहुत सीमित करती है।

उम्मीद है कि कोई इसे स्पष्ट करने में सक्षम होगा, या कम से कम मुझे कुछ नया सिखाएगा; शायद मेरा मॉडल सिर्फ बकवास है और ऐसा करने का एक आसान और आसान तरीका है? या हो सकता है कि मेरा मॉडल गैर-एसक्यूएल डेटाबेस के लिए संभव नहीं है।


100% सुनिश्चित नहीं है कि यह पूरी तरह से समस्या हल करता है, क्योंकि आपके उपयोग के लिए किनारे के मामले हो सकते हैं। लेकिन 5 मिनट की त्वरित सोच के साथ, मुझे लगता है कि निम्नलिखित आपकी समस्या का समाधान कर सकते हैं:

आप Instagram के समान मॉडल का उपयोग करने पर विचार कर सकते हैं। अगर मेरी याददाश्त मुझे अच्छी तरह से सेवा देती है, तो वे जो भी उपयोग करते हैं वह एक events आधारित संग्रह है। इस विशिष्ट संदर्भ में events से मेरा मतलब है कि उपयोगकर्ता द्वारा किए गए सभी कार्यों का मतलब है। तो एक comment एक घटना है, like एक घटना आदि है।

इससे ऐसा होगा कि आपको कुल में तीन मुख्य संग्रह की आवश्यकता होगी।

users
-- userID1
---- userdata (profile pic, bio etc.)
---- postsByUser : [postID1, postID2]
---- followedBy : [userID2, ... ]
---- following : [userID2, ... ]
-- userID2
---- userdata (profile pic, bio etc.)


posts
-- postID1 (timestamp, so it's sortable)
---- contents
---- author : userID1
---- authorPic : authorPicUrl
---- authorPoints : 12345
---- taggedUsers : []
---- comments
------ comment1 : { copy of comment event }
---- likes : [userID1, userID2]
-- postID2 (timestamp)
---- contents
... 


events
-- eventID1
---- type : comment
---- timestamp
---- byWhom : userID
---- toWhichPost : postID
---- contents : comment-text
-- eventID2
---- type : like
---- timestamp
---- byWhom : userID
---- toWhichPost : postID

अपने उपयोगकर्ता-जैव पृष्ठ के लिए, आप उपयोगकर्ताओं से पूछेंगे।

समाचार फ़ीड के लिए आप उपयोगकर्ता आईडी द्वारा सभी posts लिए पोस्ट पूछेंगे, आपका उपयोगकर्ता पिछले 1 दिन (या किसी भी दिए गए समय में) का पालन कर रहा है,

गतिविधि फ़ीड पेज (टिप्पणियां / पसंद इत्यादि) के लिए आप उन events से पूछेंगे जो आपके उपयोगकर्ता आईडी के लिए प्रासंगिक हैं, जो पिछले 1 दिन तक सीमित हैं (या किसी दिए गए टाइमपैन)

आखिरकार पोस्ट / घटनाओं के लिए अगले दिन पूछें क्योंकि उपयोगकर्ता स्क्रॉल करता है (या यदि उन दिनों में कोई नई गतिविधि नहीं है)

दोबारा, यह केवल एक त्वरित विचार है, मुझे पता है कि एसओएफ के बुजुर्गों को आमतौर पर इन्हें क्रूस पर चढ़ाने की आदत है, इसलिए अगर इस जवाब में त्रुटियां हैं तो मुझे एसओएफ के साथी सदस्यों को क्षमा करें :)

उम्मीद है कि यह फ्रांसिस्को मदद करता है,

सौभाग्य!





google-cloud-firestore