رهام رفیعی تهرانی
رهام رفیعی تهرانی
خواندن ۲ دقیقه·۳ سال پیش

تعریف subdocument ها در mongoose و جستجوی آنها

دیروز میخواستم چند تا شهر و استان رو وارد دیتابیس mongo کنم. میتونستم استان ها و شهرها رو بصورت مجزا در کالکشن های مجزای States و Cities پیاده سازی کنم و برای ایجاد رابطه بینشون، ویژگی (property) شناسه استان (stateId) را داخل هر شهر تعریف کنم.

ولی تصمیم گرفتم بر اساس شرایط پروژه، فقط از یک کالکشن استفاده کنم. یعنی یک کالکشن بنام استان ها (States) داشته باشم که شامل داکیومنت های استان باشه و آرایه ای از شهرهای هر استان داخل داکیومنتش قرار بگیرند. در واقع هر داکیومنت استان (ُState) شامل ویژگی های (properties) زیر باشه:

  • نام (name) از نوع string
  • اکتیو (active) از نوع boolean
  • شهرها (Cities) از نوع آرایه ای از subdocument های City
  • سایر ویژگی ها

ویژگی subdocument اینه که می تونه خودش شناسه مستقل خودش رو داشته باشه. مگر اینکه طراح تشخیص بده نیازی به شناسه مستقل نیست و جلوی تعریف شناسه رو بگیره.

در mongoose خیلی ساده میشه subdocument تعریف کرد. به این صورت که اول باید schema برای شهر تعریف کنیم (City Schema):


بعد میتونیم City Schema رو به صورت آرایه داخل State Schema تعریف میکنیم:


تعریف آرایه ای از subdocument ها داخل یک داکیومنت به همین راحتیه:

میتونیم کل داکیومنت رو یک جا بسازیم:


موضوع بعدی پیدا کردن یک subdocument هست. فرض کنیم 32 استان داریم و هر استان کلی شهر. حالا میخوایم با کمک شناسه یک شهر، ببینیم در کالکشن استان ها وجود داره یا نه و اگر هست پیداش کنیم.

راه ساده اینکه که بگیم استانی رو به ما بده که شهری با این شناسه داره:

در این حالت، اگر شهر وجود داشته باشه، کل داکیومنت استان (شامل اطلاعات استان و همه شهرها) برمیگرده و بعد باید بگردیم داخل شهرها و اطلاعات شهر رو دوباره جستجو کنیم.

راه بهتر: برای اینکه دوباره خودمون نگردیم و شهر مورد نظر رو پیدا کنیم، میتونیم از یک projection بنام $elemMatchاستفاده کنیم. به صورت کلی، کاربرد projection در فیلتر کردن نتیجه است. در راه دوم علاوه بر دریافت اطلاعات شهرها، شهر مورد نظر خودمون رو هم فیلتر میکنیم:

خط دوم لیست شهرها رو بر اساس شناسه فیلتر میکنه. در نهایت ما آرایه ای داریم شامل یک داکیومنت استان که داخلش آرایه ای شامل یک شهر وجود دارد. اگر شهر مورد نظر وجود نداشته باشه، کلا یک آرایه خالی برخواهد گشت.

:)




mongodbmongoosenodejssubdocumentexpressjs
برنامه نویسی یک شغل نیست، یک هنره.
شاید از این پست‌ها خوشتان بیاید