اگر در جلسه قبل به نتیجه برخی از کوئری ها دقت کرده باشید، متوجه می شوید که اطلاعات موجود در پایگاه داده ما پر از آرایه ها و embedded document های مختلف است. به طور مثال قسمتی از این داده ها را برایتان قرار می دهم:
// بقیه اطلاعات // "genres" : [ "Comedy", "Family" ], "status" : "Ended", "runtime" : 30, "premiered" : "2009-09-30", "officialSite" : "http://abc.go.com/shows/the-middle", "schedule" : { "time" : "20:00", "days" : [ "Tuesday" ] }, "rating" : { "average" : 8.2 }, "weight" : 95, "network" : { "id" : 3, "name" : "ABC", "country" : { "name" : "United States", "code" : "US", "timezone" : "America/New_York" } }, // بقیه اطلاعات //
ما در داده های بالا network را داریم که درون خودش country را به صورت یک embedded document دارد. همچنین خصوصیت genres را داریم که دو مقدار comedy و family را در خود دارد. یا مثلا rating (امتیاز یک فیلم rating نام دارد) را داریم که درون خودش average را دارد. برای این نوع از داده ها چطور باید کوئری بزنیم؟ مثلا چطور به average (به معنی «میانگین») دسترسی داشته باشیم؟
من با embedded document ها شروع می کنم. نکته اول این است که حتما باید از double quotation (علامت های "") استفاده کنید. سپس به شکل یک شیء عادی در جاوا اسکریپت از اپراتور نقطه به موارد درون هم دسترسی خواهیم داشت. مثلا برای دسترسی به average می توان به شکل زیر عمل کرد:
db.movies.find({"rating.average": {$gt: 7}}).pretty()
همانطور که می بینید rating.average باید درون double quotation باشد. اپراتور gt هم که یعنی «بزرگ تر از» بنابراین تمام سریال ها و فیلم هایی را می خواهیم که متوسط امتیاز آن ها (همان خصوصیت Average) از 7 بیشتر باشد. همچنین اگر 10 سطح مختلف و document تو در تو داشته باشیم، می توانیم به همین روش آن ها را کوئری بزنیم.
آرایه ها چطور؟ مثلا در قسمت genres معمولا چندین ژانر سینمایی داریم اما این ژانر ها اعضای یک آرایه هستند. چطور به آن ها دسترسی پیدا کنیم؟ برای انجام این کار باید به شکل زیر عمل کنیم:
db.movies.find({genres: "Drama"}).pretty()
بنابراین بسیار ساده است اما دو نکته مهم وجود دارد:
البته اگر می خواهید به MongoDB بگویید که قرار است genres فقط یک عضو به نام Drama داشته باشد باید کوئری را به شکل زیر تغییر دهید:
db.movies.find({genres: ["Drama"]}).pretty()
بنابراین با قرار دادن علامت های [] مشخص کرده ام که genres باید دقیقا برابر یک آرایه با یک عضو به نام Drama باشد.
حالا که با مطالب پایه ای آشنا شدیم، باید با اپراتور های باقی مانده نیز آشنا شویم. یادتان باشد که این اپراتور ها هنوز هم از نظر فنی جزو دسته اپراتور های مقایسه ای هستند. اولین اپراتور ما in$ است. اپراتور in$ به ما اجازه می دهد که چند مقدار مشخص را در یک کوئری هدف بگیریم. به طور مثال تصور کنید که می خواهیم به MongoDB بگوییم فیلم ها و سریال هایی را انتخاب کن که مدت زمان آن ها (runtime) فقط برابر با 30 یا 42 دقیقه باشد. برای این کار باید به شکل زیر عمل کنیم:
db.movies.find({runtime: {$in: [30, 42]}}).pretty()
ما از اپراتور in$ مانند هر اپراتور دیگری استفاده می کنیم اما مقدار پاس داده شده به آن حتما باید یک آرایه باشد که مقادیر مورد نظر شما به عنوان اعضای آن قرار بگیرند. اپراتور دوم ما nin$ است که مخفف not in (درون چیزی نبودن) را نشان می دهد. مثلا به کد زیر توجه کنید:
db.movies.find({runtime: {$nin: [30, 42]}}).pretty()
این کد فیلم ها و سریال هایی را پیدا می کند که runtime آن ها برابر 30 یا 42 نباشد یا به زبان ساده تر هر چیزی به جز 30 و 42 باشد. با این حساب خلاصه ای از کل اپراتور های مقایسه ای (comparison operators) را در لیست زیر مشاهده می کنید:
در قسمت بعد به سراغ اپراتور های منطقی (Logical Operators) می رویم.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.