पाइपलाइन की कार्रवाइयों में कई सुविधाएं उपलब्ध होती हैं. हालांकि, नियमों का इंजन सिर्फ़ तुलना (जैसे, >) और लॉजिकल (जैसे, or) फ़िल्टर को पहचान सकता है. इससे यह पक्का किया जा सकता है कि शर्तों का पालन किया जा रहा है और सुरक्षा बनी हुई है.
साथ काम करने वाले फ़िल्टर एक्सप्रेशन
पाइपलाइन के ऑपरेशन को आपके नियमों के हिसाब से सेट की गई सीमाओं के अंदर रखने के लिए, उसे कॉन्स्टेंट के ख़िलाफ़ लॉजिकल और तुलना करने वाले ऑपरेटर का इस्तेमाल करना होगा. नियम इंजन, यहां दिए गए फ़िल्टर टाइप को पहचानता है:
- तुलनाएं:
eq,neq,gt,gte,lt,lte,in,arrayContains. - लॉजिकल:
and,or.
यहां कुछ उदाहरण दिए गए हैं:
where(eq("foo", 2))where(lt("foo", 2))documents("/user/1", "/user/2").where(...)
अनुरोध की प्रॉपर्टी
पुष्टि करने और क्वेरी के संदर्भ की पुष्टि करने के लिए, request ऑब्जेक्ट का इस्तेमाल किया जा सकता है. हालांकि, स्टैंडर्ड क्वेरी में उपलब्ध कुछ प्रॉपर्टी, पाइपलाइन ऑपरेशन में काम नहीं करती हैं.
इस्तेमाल की जा सकने वाली प्रॉपर्टी
नया इंजन, इन प्रॉपर्टी के साथ काम करता रहेगा:
request.auth: उपयोगकर्ता के यूआईडी और टोकन डेटा को ऐक्सेस करें.request.method: इससे ऑपरेशन की पहचान होती है. उदाहरण के लिए,get,list.request.path: ऐक्सेस किए जा रहे संसाधन का पाथ.request.time: अनुरोध का सर्वर-साइड टाइमस्टैंप.
इस्तेमाल न की जा सकने वाली प्रॉपर्टी
पाइपलाइन ऑपरेशन के नियमों की जांच के लिए, request.query प्रॉपर्टी काम नहीं करती हैं. जैसे, limit, offset, और orderBy. ऐसा इसलिए है, क्योंकि मल्टी-स्टेज क्वेरी में इन वैल्यू का पता लगाना मुश्किल होता है.
पाइपलाइन के स्टेज को मैनेज करना और अनुमतियां
पाइपलाइन के अलग-अलग चरण होते हैं. ये चरण, सुरक्षा नियमों में मौजूद खास कार्रवाइयों से जुड़े होते हैं:
allow listअनुमतियां: येcollection(),collectionGroup(), औरdatabase()चरणों के दौरान ट्रिगर होती हैं.allow getअनुमतियां: यहdocuments()स्टेज से ट्रिगर होती है. इसे बैचgetऑपरेशन की तरह ही माना जाता है.- लिटरल स्टेज:
literals()स्टेज, डेटाबेस से नहीं पढ़ता, लेकिन इससे लागत लग सकती है. इसका गलत इस्तेमाल रोकने के लिए, इसे किसी दूसरे चरण (जैसे किcollection()) के साथ जोड़ा जाना चाहिए. इस चरण की पुष्टि नियमों के हिसाब से की जा सकती है.
फ़ील्ड में बदलाव करने के चरण
नियम सिर्फ़ सेव किए गए डेटा पर लागू होते हैं, न कि निकाली गई वैल्यू पर. अगर किसी पाइपलाइन में ऐसे चरण शामिल हैं जो फ़ील्ड में बदलाव करते हैं (उदाहरण के लिए, add_fields(...), replace_with(...), select(...), remove_fields(...)), तो उस चरण के बाद, नियमों का इंजन फ़िल्टर की शर्तों को लागू करना बंद कर देता है. यह पक्का करने के लिए कि नियम उम्मीद के मुताबिक काम कर रहे हैं, फ़िल्टर के चरणों (जैसे, where) को उन चरणों से पहले रखें जो सेव किए गए ओरिजनल दस्तावेज़ों में बदलाव कर सकते हैं.
उदाहरण के लिए, यहां दिया गया सुरक्षा नियम देखें:
match /databases/{database}/documents {
match /cities/{city} {
// Allow the user to read data if the document has the 'visibility'
// field set to 'public'
allow read: if resource.data.visibility == 'public';
}
}
अस्वीकार किया गया: यह नियम, इस पाइपलाइन को अस्वीकार करता है. इसकी वजह यह है कि addFields स्टेज, उन दस्तावेज़ों को फ़िल्टर करने से पहले होता है जिनमें visibility, public है:
const results = await db.pipeline()
.collection("/cities")
// Filters after a modification stage are ignored by Rules.
.addFields(constant(1000).as("population"))
.where(eq(field("visibility"), constant("public")))
.execute();
अनुमति है: इस नियम के तहत, इस पाइपलाइन को अनुमति दी गई है, क्योंकि where(eq(field("visibility"), constant("public"))) स्टेज, बदलाव करने वाले किसी भी स्टेज से पहले होता है:
const results = await db.pipeline()
.collection("/cities")
.where(eq(field("visibility"), constant("public")))
.addFields(constant(1000).as("population"))
.execute();