همه چیز در مورد lookup در mongodb برای join زدن بین collectionها



visibility  
mode_comment   ۰

همه چیز در مورد lookup در mongodb برای join زدن بین collectionها

در این مطلب قصد داریم همه اون چیزی که برای lookup در MongoDB برای join زدن بین collectionها نیاز هست که بدونین رو در اختیارتون قرار بدیم.

همونطور که اطلاع دارید MongoDB یک پایگاه‌داده رابطه‌ای یا Relational  مثل SQL نیست اما شما میتونین با امکاناتی که MongoDB نسخه 3.2 به بعد در اختیارتون قرار داده، Left outer join رو بین collectionها انجام بدین و نتایج مورد نظرتون رو بدست بیارید.

با استفاده از $lookup در MongoDB میتونین این کار رو به راحتی انجام بدین. با استفاده از lookup میتونین مشخص کنید که چه collection ای رو میخواید با collection فعلی join کنید و کدام فیلدها باید match بشن تا این join صورت بگیره.

از $lookup همانند دیگر عملگرها در aggregation ها استفاده میشه تا query مورد نظر خودمون رو بر روی داده‌های موجود در پایگاه داده اجرا کنیم و اطلاعات مورد نظرمون رو به دست بیاریم.

Syntax استفاده از این عملگر بصورت زیر هست:

توضیحات مربوط به کدهای بالا:

متخصص وردپرس
قالب ها و پلاگین های حرفه ای وردپرس رو خودت بنویس! بازار طراحی قالب و پلاگین نویسی وردپرس به شدت داغه و اگر بلد باشید با برنامه نویسی اختصاصی، قالب ها و پلاگین های دلخواه بنویسید تو مارکت های مطرح دنیا و یا از طریق فریلنسری می تونید به درآمد بالا برید. دوره متخصص وردپرس سون لرن رو حتما ببینید: متخصص وردپرس arrow_back
  • from : نام اون collection در database فعلی که قصد داریم با اون join بزنیم رو در اینجا مشخص میکنیم.
  • localField : نام فیلد در collection فعلی
  • foreignField : نام فیلد در collection مقصد. عملگر lookup در mongodb این دو فیلد localField و foreignField رو با هم بررسی میکنه و document هایی که برابر هستند رو انتخاب میکنه و در اختیار ما قرار میده.
  • as : با استفاده از این مورد نام فیلد جدیدی که به collection فعلی اضافه میشه و آرایه‌ای از نتایج در اون قرار میگیره رو مشخص میکنیم.

اگر قصد داشتیم در SQL همچنین کاری رو انجام بدیم، بصورت زیر عمل میکردیم:

برای فهم بیشتر یک مثال ساده رو با هم بررسی میکنیم. یک collection به نام orders با document های زیر رو به وجود میاریم:

یک collection دیگه هم به نام inventory با document های زیر رو میسازیم:

حالا میخوایم بین این دو collection یک join بزنیم. collection مبدا رو orders و collection مقصد رو inventory در نظر میگیریم. میخوایم اون document هایی در inventory که sku اونا برابر با item موجود در orders هست رو پیدا کنیم. برای اینکار بصورت زیر عمل میکنیم:

اطلاعات پیدا شده رو درون ویژگی inventory_docs قرار میدیم. خروجی join بالا بصورت زیر میشه:

اگر بخوایم همین کار رو درون SQL انجام بدیم، query بصورت زیر خواهد بود:

استفاده از شروط پیچیده در lookup

از نسخه 3.6 به بعد pipeline اضافه شده است که میتونین با استفاده از اون پیشرفته‌تر از lookup استفاده کنید. شما میتونین با استفاده از یک syntax دیگه از شروط پیچیده‌تری در lookup ها استفاده کنید و نتایج دقیق‌تری رو بدست بیارید. Syntax این مورد بصورت زیر هست:

ویژگی‌های from و as مانند قبل هستند. ویژگی‌های دیگر بصورت زیر تعریف میشن:

  • let : این ویژگی دلخواه هست. در این ویژگی میتونین متغیرهایی که درون ویژگی pipeline از اونا استفاده میشه، تعریف کنید. pipeline بصورت مستقیم نمیتونه به ویژگی‌های document های ورودی دسترسی داشته باشه و در ابتدا باید متغیرهایی رو در let تعریف کنید و ویژگی‌های مورد نظرتون رو درون اونا قرار بدین و بعد از اون درون pipeline ازشون استفاده کنید. برای دسترسی به متغیرهایی که در let تعریف کردید، باید از عملگر $expr استفاده کنید.
  • pipeline : با استفاده از این ویژگی میتونین pipeline که بر روی joined collection اجرا میشه رو مشخص کنید. برای اینکه pipeline هیچ تاثیری بر روی خروجی نداشته باشه، میتونین یک آرایه خالی رو برای این ویژگی قرار بدیم.

اگر بخواهیم در SQL همچنین query رو بزنیم، بصورت زیر عمل میکنیم:

حالا یک مثال رو با هم بررسی کنیم. برای اینکار یک collection بنام orders با سه document قرار میدیم:

یک collection دیگه هم بنام warehouses هم با document های زیر قرار میدیم:

حالا یک lookup برای orders میزنیم. بصورت زیر:

در کد بالا دو متغیر order_item و order_qty رو تعریف کردیم و در بخش pipeline از اونا استفاده کردیم. برای استفاده از متغیرها باید از $$ استفاده کنید. شرط lookup زدن بصورت زیر هست:

  • stock_item برابر با order_item باشه
  • instock بزرگتر یا مساوی order_qty باشه

با استفاده از $project هم مشخص کردیم که در خروجی stock_item و _id رو نیازی نداریم. خروجی بصورت زیر میشه:

معادل کد بالا میتونین در SQL بصورت زیر query بزنید:

به همین راحتی.

برای مشاهده مطالب مربوط با موضوع MongoDB در سایت سون لرن بر روی این لینک کلیک کنید.

نتیجه گیری

دیدید که با استفاده از عملگر lookup در MongoDB توانستیم بین collection ها join بزنیم و اطلاعات مورد نظرمون رو به دست بیاریم.

comment دیدگاه کاربران

نیاز به لاگین

برای ارسال دیدگاه و یا پرسیدن سوال خود در این قسمت، باید در سایت لاگین شوید.