چگونه می توان از زمینه های غیر موجود در Firestore درخواست کرد

به عنوان توسعه دهندگان که با پایگاه داده Firestore Firebase کار می کنند ، ما اغلب با موقعیت هایی روبرو می شویم که باید از اسنادی که منطقه خاصی ندارند ، سؤال شود. باید ساده باشد ، درست است؟ خوب ، متأسفانه ، این کار به ظاهر ساده چالش برانگیزتر از حد انتظار است. در این مقاله ، ما بررسی خواهیم کرد که چرا درخواست از زمینه های Firestore غیر موجود مشکل ساز است و ما در مورد برخی از راه حل های بالقوه بحث می کنیم.
چالش: مکانیسم نمایه سازی Firestore Firestore
درخواست های Firestore بر روی سیستم نمایه سازی آن ساخته شده است. همانطور که داگ استیونسون ، عضو سابق تیم Firebase ، به طور خلاصه آن را می گوید:
“شما نمی توانید از خود چیزی بخواهید که در Firestore وجود ندارد. این زمینه باید وجود داشته باشد تا شاخص Firestore بتواند آن را تحقق بخشد.”
– داگ استیونسون
به عنوان مثال ، اگر سعی می کنید Firestore تماس زیر را در Node.js برقرار کنید – کجا db آیا رابطه شما اولیه را آغاز می کند:
const querySnapShot = await db.collection("users").where("age", "==", null).get();
querySnapShot.forEach(doc => console.log(doc.data());
هیچ نتیجه ای بازگردانده نمی شود.
این جنبه اصلی معماری Firestore به این معنی است که روشهای سنتی درخواست مناطق غیر موجود مانند where("field", "==", null) این فقط کار نخواهد کرد
چرا نمی توانیم در مورد زمینه های غیر موجود بپرسیم؟
دلیل این امر در چگونگی مدیریت Firestore شاخص های خود است:
- تمام درخواست های Firestore به شاخص ها متکی هستند. این همان چیزی است که باعث می شود درخواست ها خیلی سریع و چرا وقتی سعی می کنید از آن استفاده کنید
whereاز یک زمینه جدید درخواست کنید که برای ساخت یک شاخص مورد نیاز باشد. - اگر این زمینه در سند Firestore وجود داشته باشد ، این سند فقط در فهرست زمینه گنجانده شده است. یعنی چگونه می توانید چیزی را که وجود ندارد فهرست بندی کنید؟ شما نمی توانید.
- اگر سند ارزش یک زمینه خاص را نداشته باشد ، در این فهرست برای این قسمت حضور نخواهد داشت.
این بدان معنی است که هیچ روش مستقیمی برای درخواست اسناد که زمینه خاصی ندارند ، وجود ندارد ، زیرا این اسناد در فهرست مربوطه ارسال نمی شوند. بنابراین هنگام استفاده where("field", "==", null) هیچ چیز برمی گردد.
همچنین می توانید از خود بپرسید ، “خوب ، در MongoDB می توانید به راحتی از خود در زمینه های غیر موجود بخواهید ، پس چرا Firestore نیست؟” درست است که می توانید درخواستی مانند db.mycollection.find ({“سن”: {“$ وجود دارد”: false}}). با این حال ، اگر از شما پرسیده شوید ، نمی توانید جستجوی فهرست MongoDB را انجام دهید $"exists": false درخواست کند و بی اثر.
راه حل و راه حل
با این حال ، چندین رویکرد وجود دارد که می توانیم برای “درخواست” برای زمینه های غیر موجود استفاده کنیم. متأسفانه ، همانطور که در زیر خواهیم دید ، هر راه حل سازش دارد.
1. تمام اسناد را اضافه کنید و یک طرف مشتری یا سرور را فیلتر کنید
هنگام برخورد با مجموعه های کوچکتر ، می توانید تمام اسناد را بیاورید و آنها را در کد برنامه خود فیلتر کنید. در حال حاضر ، این ساده ترین راه برای یافتن اسناد بدون زمینه خاص است:
const getAllDocsWithoutField = async (collectionName, fieldName) => {
const snapshot = await db.collection(collectionName).get();
const docsWithoutField = snapshot.docs.filter(doc => {
const data = doc.data();
return !(fieldName in data);
});
return docsWithoutField;
};
// Example Usage
const docsWithoutAge = await getAllDocsWithoutField('users', 'age');
مزایای این رویکرد ::
- سادگی: این رویکرد کاربرد و درک آن آسان است.
- انعطاف پذیری: به راحتی می توانید منطق فیلتر را برای پردازش موارد پیچیده یا چندین زمینه تغییر دهید.
- هیچ تغییری در مدل داده وجود ندارد: این نیازی به تغییر در ساختار داده های موجود شما ندارد.
- نتایج دقیق: این روش یافتن تمام اسناد بدون قسمت مشخص شده را تضمین می کند.
مضرات این رویکرد:
- بی کارایی: این روش مستلزم بازیابی کلیه اسناد موجود در مجموعه است که می تواند برای مجموعه های بزرگ آهسته و منابع باشد.
- هزینه: هزینه های آتش نشانی برای عملیات خواندن. با این رویکرد ، شما هر سند را در مجموعه می خوانید که می تواند به سرعت گران شود. از سال 2024 ، Google Cloud برای بیشتر مناطق 0.031 دلار در هر 100000 سند پرداخت کرد.
- پهنای باند: استخراج تمام اسناد نوار فرکانس بیشتری مصرف می کنند ، که می تواند برای برنامه های تلفن همراه یا مناطقی با اتصال به اینترنت محدود باشد. ما معمولاً توصیه می کنیم که برای درخواست های بزرگتر این تماس ها را از سرور انجام دهید.
- محدودیت های درخواست Firestore: Firestore محدودیت در میزان داده هایی که می توان در یک درخواست بازیابی کرد. حد فعلی 1 مگابایت است. برای مجموعه های بزرگ ، می توانید قبل از استخراج تمام اسناد ، به این حد ضربه بزنید.
- اجرای: از آنجا که فیلتر توسط مشتری رخ می دهد ، عملکرد عملکرد فیلتر به سخت افزار مشتری بستگی دارد ، که می تواند منجر به عملکرد آهسته در دستگاه های کمتر قدرتمند شود. ممکن است دوباره این سرور را در نظر بگیرید.
2. زمینه را برای عدم وجود یک میدان صفر تنظیم کنید
اگر درخواست اسناد بدون زمینه خاص یک الزام مشترک در برنامه شما است ، زمینه را در نظر بگیرید nullبه عنوان مثال:
{
name: "John Doe",
age: 30
}
{
name: "Jane Smith",
age: null
}
این به شما امکان می دهد مستقیماً از خود بپرسید:
const snapshot = await db.collection('users')
.where('age', '==', null)
.get();
مزایای این رویکرد:
- کارایی: این درخواست می تواند از شاخص های Firestore استفاده کند ، که باعث می شود خیلی سریعتر و سودآورتر از استخراج کلیه اسناد باشد.
- ناپذیری: این روش حتی برای مجموعه های بسیار بزرگ نیز خوب کار می کند.
- سودمند: شما فقط اسناد لازم را بازیابی می کنید ، عملیات خواندن را کاهش می دهید و از نوار فرکانس استفاده می کنید.
مضرات این رویکرد:
- تعمیر و نگهداری روی سر: شما باید تضمین کنید
nullاین قسمت به صراحت تنظیم می شود هر زمان که اسناد را اضافه یا به روز کنید و اسناد موجود را با آن به روز کنیدnullاگر در حال حاضر وجود نداشته باشد. این ممکن است بسته به نحوه ساخت سیستم خود ، یک دردسر باشد. - داده: شما یک زمینه اضافی را ذخیره می کنید ، احتمالاً برای بسیاری از اسناد ، که کمی هزینه های ذخیره سازی را افزایش می دهد ، اما خیلی زیاد نیست.
عواقب و بهترین شیوه ها
عدم توانایی در درخواست مستقیم زمینه های غیر موجود در Firestore پیامدهای مختلفی برای طراحی برنامه ها و داده های مدل سازی دارد:
- دلایل مدل داده: هنگام طراحی مدل داده Firestore خود ، در نظر بگیرید که آیا نیاز به درخواست پرواز دارید یا خیر. اگر چنین است برنامه ریزی کنید
nullزمینه از ابتدا. - منطق برنامه: برای مقابله با زمینه های غیر موجود در قسمت در کد برنامه خود آماده باشید.
- برنامه ریزی کارآیی: برای مجموعه های بزرگ ، صفحات را اعمال کنید یا دامنه درخواست ها را محدود کنید تا هنگام استفاده از رویکرد تصفیه مشتری از مشکلات عملکرد جلوگیری کنید. می توانید استفاده کنید
limitتابعی برای دستیابی به این هدف. - مدیریت هزینه: هزینه های بالقوه مرتبط با خواندن کل مجموعه ها را در نظر داشته باشید. استفاده از استراتژی های حافظه پنهان را در نظر بگیرید – شاید در بسته های Redis یا Firestore.
هیچ راه حل کاملی وجود ندارد
درخواست زمینه های غیر موجود در Firestore به دلیل معماری پایگاه داده یک چالش است. اگرچه هیچ راه حل کاملی وجود ندارد ، رویکردهای توضیح داده شده در بالا راه هایی برای دور زدن این محدودیت ارائه می دهند. انتخاب بین مشتری یا فیلتراسیون سرور یا استفاده از صفر بستگی به مورد خاص استفاده شما ، میزان داده های شما ، فرکانس به روزرسانی و نیازهای عملکرد دارد. اگر مجموعه جدیدی را شروع کنید ، گزینه های دوم ممکن است مناسب ترین باشد.
از آنجا که Firestore همچنان به پیشرفت خود ادامه می دهد ، ارزش آن را دارد که عملکردهای جدید یا قابلیت های پرس و جو را دنبال کند که می تواند این محدودیت را در آینده انجام دهد-همانطور که توانایی سالها از زمینه های غیر موجود مانند MongoDB است ، امیدواریم که منتشر شود.
امتیاز
ویژگی نفیس Firestore است orderByکه فقط با این زمینه اسناد را برمی گرداند. به عنوان مثال ، .orderBy("age") اسناد را فقط با age میدان اگرچه این برای درخواست زمینه های غیر موجود مفید نیست ، اگر می تواند برای یافتن اسناد خاص و عدم بازگشت کل مجموعه مفید باشد.
برای iirshare
Ayrshare یک API برای رسانه های اجتماعی است که به شما امکان می دهد انتشارات را ارسال کنید ، تجزیه و تحلیل دریافت کنید ، نظرات را مدیریت کنید و پیام های مستقیم را به طور مستقیم به شبکه های اجتماعی از سیستم عامل خود ارسال کنید. در اسناد API ما در رسانه های اجتماعی بیشتر بدانید.



