मैं अपने एंड्रॉइड ऐप के साथ क्लाउड फायरस्टोर का उपयोग करने की कोशिश कर रहा हूं। तो मैं 3-4 फ़ील्ड स्टोर कर रहा हूं। तो मैं कारों के संग्रह के साथ एक उदाहरण दूंगा। एक "कार" संग्रह है। कार संग्रह के दस्तावेज़ों में फ़ील्ड हैं: निर्माता, मॉडल, शीर्ष गति।

मैं नीचे दिए गए कोड के साथ एंड्रॉइड के साथ डेटा जोड़ रहा हूं:

dManufacturer = "Hyundai"
dModel = "Kona"
dTopSpeed ="150"
Map<String, Object> car = new HashMap<>();
car.put("manufacturer", dManufacturer);
car.put("model", dModel);
car.put("top_speed",dTopSpeed);


db.collection(cars")
.add(car)
.addOnSuccessListener(new OnSuccessListener<DocumentReference>() {
 @Override
 public void onSuccess(DocumentReference documentReference) {
 Log.d("firebaseab", "DocumentSnapshot added with ID: " + documentReference.getId());
 }
})
.addOnFailureListener(new OnFailureListener() {
 @Override
 public void onFailure(@NonNull Exception e) {
 Log.w("firebaseab", "Error adding document", e);
 }
});

तो मेरे ऐप का उपयोग करने वाला कोई भी उपयोगकर्ता केवल 1 कार दस्तावेज़ और उस दस्तावेज़ को जोड़ने में सक्षम होना चाहिए यदि संग्रह में दस्तावेज़ के समान सभी फ़ील्ड मान हैं तो डेटा जोड़ा नहीं जाना चाहिए।

मैं बताऊंगा कि मैंने किन विकल्पों का प्रयास किया है और मैं सोच रहा हूं, लेकिन कृपया मुझे यह बताने में मदद करें कि इसे प्राप्त करने का सबसे अच्छा तरीका क्या है और इसे कैसे प्राप्त किया जाए।

तो मैं क्वेरी कोटा को बचाने के लिए सत्यापन सुरक्षा नियम बनाने के साथ इसे प्राप्त करने के बारे में सोच रहा था ताकि जितना संभव हो सके मुफ्त योजना में रखा जा सके लेकिन मुझे समझ में नहीं आ रहा है कि यह कैसे काम करता है इसलिए मुझे त्रुटियां मिलती रहती हैं या अनुमति से इनकार किया जाता है।

जिस तरह से मैंने कोशिश की:

1) मैंने संग्रह में दस्तावेजों के साथ "! =" मिलान के लिए एक नियम लिखने की कोशिश की, जो कि मैं ऊपर के रूप में एंड्रॉइड से करता हूं, लेकिन यह मुझे त्रुटियां दे रहा था। मुझे अभी तक पूरी तरह से समझ नहीं आया है कि क्या हो रहा है। नियम इस प्रकार है:

service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read;
    }
    // match /{document=**} {
    //   //allow create: if document != request.resource.data;
    //   allow create: if document.manufacturer == "Google";
    // }
    match /cars/{car} {
      allow create : if request.resource.data.manufacturer != resource.data.manufacturer
                    && request.resource.data.model != resource.data.model
                    && request.resource.data.topSpeed != resource.data.topSpeed;

    }
  }
}

लेकिन उपरोक्त त्रुटि दी और काम नहीं कर रहा था।

एक दस्तावेज़ में तुलना करने के लिए मौजूद ! का उपयोग कैसे करें, यह नहीं जानते कि समान फ़ील्ड मान मौजूद हैं या नहीं। उनके पास अलग-अलग दस्तावेज़ आईडी हो सकते हैं लेकिन यदि फ़ील्ड के मान समान हैं तो मैं उसी फ़ील्ड मानों के साथ कोई अन्य दस्तावेज़ नहीं जोड़ना चाहता हूं।

जिस तरीके से मैं सोच रहा हूं लेकिन यह नहीं जानता कि कौन सा सही है या कैसे कार्यान्वित किया जाए:

1) क्या मुझे उन सभी मूल्यों के साथ एक कंपाउंड इंडेक्स बनाना होगा जिनके लिए मुझे वहां मिलान करने की आवश्यकता है? लेकिन मैं सुरक्षा नियम कैसे लिखूं ताकि मुझे अपने कोड से पूछताछ या प्रदर्शन करने की आवश्यकता न हो।

2) क्या मुझे दस्तावेज़ आईडी को कंपाउंड इंडेक्स के रूप में बनाना चाहिए (लेकिन मुझे यह कैसे करना चाहिए और फिर सुरक्षा सत्यापन नियम कैसे लिखना चाहिए)

3) क्या मुझे क्लाइंट साइड से "manufacturer_model_topspeed" प्रारूप में दस्तावेज़ आईडी बनाना चाहिए। तो यह मेरे उदाहरण के अनुसार होगा - "हुंडई_कोना_150"। क्या यह विशिष्टता बनाए रखने में मदद करेगा। यदि ऐसा तब होगा जब समान दस्तावेज़ आईडी वाला दस्तावेज़ दर्ज किया जाएगा तो अनुमति अस्वीकार कर दी जाएगी। फिर मुझे इसे क्लाइंट पर कैसे संभालना चाहिए। क्या मैं इस विशेष निर्माण अस्वीकृत घटना को दर्शाने वाले क्लाउड फायरस्टोर से एक विशेष संदेश या मूल्य भेज सकता हूं?

4) क्या मुझे एंड्रॉइड में डिवाइस आईडी का उपयोग किसी विशेष डिवाइस से मिलान करने के लिए दस्तावेज़ आईडी के रूप में करना चाहिए ताकि यदि उपयोगकर्ता ने कोई दस्तावेज़ जोड़ा है तो वह और जोड़ नहीं सकता है। लेकिन यह दस्तावेज़ फ़ील्ड डेटा का डुप्लिकेशंस बना सकता है। मैं यह पूछ रहा हूं कि कैसे सुरक्षा नियम लिखें ताकि एक व्यक्ति जो पहले से ही एक दस्तावेज़ लिख चुका है वह दोबारा नहीं लिख सकता है।

5) मैं यह भी जानना चाहता हूं कि डुप्लिकेट डेटा को अस्वीकार करने का कोई तरीका है या नहीं, तो एंड्रॉइड में उस अस्वीकृति को कैसे प्राप्त करें, मुझे यह बताने के लिए कि अस्वीकृति एक अनचाहे त्रुटि नहीं है, इसलिए मैं भविष्य में फायरस्टोर से संपर्क नहीं करने के लिए डिवाइस पर सहेज सकता हूं।

क्या इस समस्या से संपर्क करने का कोई और बेहतर तरीका है ... कृपया बताएं। मैं क्लॉज इत्यादि का उपयोग करने के लिए क्लाइंट साइड कोड का थोड़ा सा उपयोग भी कर सकता हूं लेकिन मैं रीड कोटा को कम करना चाहता हूं। इसे न्यूनतम पढ़ने/लिखने के कोटा के साथ कैसे करें। मैं क्लाउड फायरस्टोर के साथ शुरुआत कर रहा हूं।

0
user rk 26 मई 2019, 00:45

1 उत्तर

सबसे बढ़िया उत्तर

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

सुरक्षा नियम क्या कर सकते हैं कर सकते हैं एक विशिष्ट दस्तावेज़ के मूल्यों की जाँच करें, या किसी विशिष्ट दस्तावेज़ के अस्तित्व के लिए। दोनों ही मामलों में आपको दस्तावेज़ का पूरा पथ पता होना चाहिए, जिसमें विचाराधीन दस्तावेज़ की आईडी भी शामिल है।

तो आप क्या कर सकते हैं एक अतिरिक्त संग्रह बनाएं, जहां प्रत्येक दस्तावेज़ की कुंजी/आईडी उन सभी फ़ील्ड मानों का संयोजन है जिन्हें आप अद्वितीय बनाना चाहते हैं। तब आपके सुरक्षा नियम यह जांच सकते हैं कि क्या इस द्वितीयक संग्रह (जिसे अक्सर "इंडेक्स" कहा जाता है) में कोई दस्तावेज़ पहले से मौजूद है, और यदि ऐसा है तो लिखने की अनुमति नहीं है।

वैकल्पिक रूप से, आप एक क्लाउड फ़ंक्शन बना सकते हैं जो दस्तावेज़ों का निर्माण करता है। अपने क्लाउड फ़ंक्शंस कोड में आप डेटाबेस को क्वेरी कर सकते हैं, और केवल बिना किसी विरोध के दस्तावेज़ बना सकते हैं। जब आप इस दृष्टिकोण का उपयोग करते हैं, तब भी आप ऐप को सीधे डेटाबेस से पढ़ने दे सकते हैं, और अपडेट कर सकते हैं।

0
Frank van Puffelen 25 मई 2019, 22:17