मेरे पास एक गेम है जो मल्टीप्लेयर सेव रखने के लिए फायरस्टोर का उपयोग करता है।

मूल रूप से प्रत्येक दस्तावेज़ में यह प्रारूप होता है ($ 20 वर्ण पी-यादृच्छिक आईडी दर्शाता है)

$savegame = {
  users = [$user1, $user2]  
  info = {turn: 2, }
  gamestate = {longjsonstring} 
} 

मैं डेटा का उपयोग कर क्वेरी करता हूं

firebase.firestore().collection('savegamescollection').where('users', 'array-contains', firebase.auth().currentUser.uid)

मैं केवल खेल में लोगों को बचाने के लिए अद्यतन करने की अनुमति देने के लिए फायरस्टोर नियमों का उपयोग करना चाहता हूं, मुझे फायरस्टोर नियमों में उपयोगकर्ता सरणी की जांच करने का कोई तरीका नहीं मिला।

तो मैंने जो किया वह था ( > एक संग्रह को दर्शाता है)

savegame = {
  > usercol = { $user1, $user2 }   - line A
  users = [user1, user2]           - line B
...
} 

मैं नियम का उपयोग करता हूं

match /savegamescollection/{doc} { 
allow read, write: if exists(/databases/$(database)/documents/savegamescollection/$(doc)/usercol/$(request.auth.uid));

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

क्वेरी और नियम दोनों को कार्य करने की अनुमति देने के लिए डेटा संरचना (उपरोक्त ए और बी) में इन पंक्तियों में से किसी एक का उपयोग करने का कोई तरीका है।

धन्यवाद

0
Paul Torrington 18 अगस्त 2020, 23:58

1 उत्तर

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

यदि आप यह लागू करना चाहते हैं कि उपयोगकर्ता को केवल उन दस्तावेज़ों का अनुरोध करने के लिए सरणी-युक्त क्वेरी का उपयोग करना चाहिए जिनमें उपयोगकर्ता का UID सूचीबद्ध है, तो आप hasAny यह जांचने के लिए कि उनका UID सूची में है या नहीं।

match /savegamescollection/{doc} {
  allow read, write: if resource.data.users.hasAny([request.auth.uid]);
}
1
Doug Stevenson 19 अगस्त 2020, 00:36