java - फायरस्टार में एक संग्रह के तहत दस्तावेजों की संख्या कैसे गिना जाए?




android firebase (2)

मैं क्लाउड फायरस्टार पर मौजूद CollectionReference गणना प्राप्त करने की कोशिश कर रहा हूं, मैंने इसे पाने की कोशिश की है:

FirebaseFirestore db = FirebaseFirestore.getInstance();
    final CollectionReference postsCollection = db.collection("Posts");

    final TaskCompletionSource<Integer> source = new TaskCompletionSource<>();
    new Thread(new Runnable() {
        @Override
        public void run() {
            int fromWhereToStart = postsCollection.get().getResult().size();
            source.setResult(fromWhereToStart);
        }
    }).start();

    Task<Integer> task = source.getTask();
    task.addOnCompleteListener(new OnCompleteListener<Integer>() {
        @Override
        public void onComplete(@NonNull Task<Integer> task) {
            Log.e("Z_fromWhereToStart", "= " + task.getResult());
        }
    });

लेकिन दुर्भाग्य से, मुझे मिल रहा है:

java.lang.IllegalStateException: Task is not yet complete

क्या IllegalStateException को ठीक करने के लिए दूसरे तरीके की गिनती प्राप्त करने का एक और तरीका है?


लॉग if (task.isSuccessful()) का उपयोग करने से पहले onCompelete () की जाँच करें if (task.isSuccessful()) । और इसके अलावा, आप डॉक्युमेंट्स के आधार पर डॉक्यूमेंट कर सकते हैं जैसे for (DocumentSnapshot document : task.getResult()){ yourCounter++;} और प्रत्येक for (DocumentSnapshot document : task.getResult()){ yourCounter++;} पर इन्क्रीमेंट counter यह जानने के लिए कि कलेक्शन के तहत कितने डॉक्यूमेंट्स उपलब्ध हैं;


वास्तव में, क्योंकि हमारे पास अपने Cloud Firestore से Posts संग्रह के नीचे सभी दस्तावेजों की संख्या की गणना करने के लिए, Firebase रीयलटाइम डेटाबेस में एक getDocumentCount() विधि नहीं है, एक getDocumentCount() विधि है। कृपया निम्नलिखित कोड का उपयोग करें:

db.collection("Posts").get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
    @Override
    public void onComplete(@NonNull Task<QuerySnapshot> task) {
        if (task.isSuccessful()) {
            int count = 0;
            for (DocumentSnapshot document : task.getResult()) {
                count++;
            }
            Log.d("TAG", count + "");
        } else {
            Log.d(TAG, "Error getting documents: ", task.getException());
        }
    }
});

या

db.collection("Posts").get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
    @Override
    public void onComplete(@NonNull Task<QuerySnapshot> task) {
        if (task.isSuccessful()) {
            Log.d("TAG", task.getResult().size() + "");
        } else {
            Log.d(TAG, "Error getting documents: ", task.getException());
        }
    }
});

उपरोक्त उदाहरण छोटे डेटासेट के लिए पर्याप्त रूप से काम करते हैं, लेकिन अगर डेटासेट बड़ा है तो यह काम नहीं करता है। लेकिन, दो और तरीके भी हैं जिनसे आप एक ही चीज हासिल कर सकते हैं।

हर बार जब आप अपने Posts संग्रह से कोई दस्तावेज़ जोड़ते हैं या हटाते हैं, तो counter को अपडेट करने के लिए क्लाउड फ़ंक्शंस का उपयोग करने का एक तरीका होगा। यह तहनिक बड़े डेटासेट के लिए भी अच्छा काम करता है। लेकिन ध्यान दें, इस मामले में, डॉक्यूमेंट्स के जोड़ और विलोपन केवल क्लाउड फायरस्टार कोटा और सीमा में वर्णित 1 प्रति सेकंड से कम या उसके बराबर की दर पर हो सकते हैं। यह पढ़ने के लिए एक एकल दस्तावेज़ है, लेकिन यह आपको वर्तमान गणना लगभग तुरंत दिखाता है।

यदि इस सीमा को पार करने के लिए आपकी आवश्यकता है, तो आपको distributed counters को लागू करने की आवश्यकता है, जैसा कि distributed counters के आधिकारिक दस्तावेज में बताया गया है।

एक व्यक्तिगत संकेत के रूप में, क्लाउड फायरस्टार में इस तरह के काउंटरों को स्टोर न करें, क्योंकि हर बार जब आप काउंटर बढ़ाते हैं या घटाते हैं, तो आपको एक read या write ऑपरेशन का खर्च आएगा। इस काउंटर को बिना किसी कीमत पर Firebase Realtime डेटाबेस में होस्ट करें।

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

निष्कर्ष के रूप में, छोटे डेटासेट के लिए पहले कोड का उपयोग करें, दूसरा क्लाउड फ़ंक्शंस का उपयोग करें क्योंकि राइट-टाइम सर्वश्रेष्ठ-प्रयास है और तीसरे ने अंतिम विकल्प का उपयोग किया है जो मैंने आपको ऊपर समझाया है।





illegalstateexception