آشنایی با اپراتورهای مقایسه‌ای در MongoDB

Introduction to Comparative Operators in MongoDB

19 اردیبهشت 1401
درسنامه درس 31 از سری دوره جامع آموزش MongoDB
MongoDB: آشنایی با اپراتور های مقایسه ای (قسمت 33)

در جلسه قبل در رابطه با مفاهیم اپراتور، متد و فیلتر صحبت کردیم تا با پیش نیازهای این فصل آشنا شویم. حالا در این جلسه می خواهیم به سراغ کار با این اپراتورهای مختلف برویم. در جلسه قبل توضیح دادم که MongoDB دو نوع اپراتور اصلی دارد که مورد بحث ما است (اپراتور های projection و اپراتور های query selector). من با اپراتور های query شروع می کنم که به دسته های زیر تقسیم می شوند:

  • comparison یا مقایسه ای
  • evaluation یا ارزیابی
  • Logical یا منطقی
  • Array یا آرایه ای
  • element یا عنصری
  • comments یا کامنتی
  • geospatial ژئوفضایی

ما در چند جلسه آینده به بررسی این اپراتور ها خواهیم پرداخت.

همانطور که می دانید متد findOne همیشه اولین سند (document) پیدا شده را به ما می دهد. اگر از فیلترها استفاده کنیم و بگوییم:

db.persons.findOne({name: "Amir"})

اولین سندی را پیدا می کند که در آن فیلد name برابر Amir باشد و اگر هم هیچ آرگومانی را به آن پاس ندهیم، اولین سند موجود در collection ما را پیدا خواهد کرد. توجه کنید که ما برای این فصل از همان پایگاه داده movieData استفاده می کنیم. ما این پایگاه داده را در فصل قبل و با استفاده از mongoimport از یک فایل وارد پایگاه داده خود کردیم. یکی از اسناد موجود در کالکشن movies را برایتان قرار می دهم تا مشاهده کنید:

        "_id" : ObjectId("5e8d82a8fed9c9b1e19c6507"),
        "id" : 4,
        "url" : "http://www.tvmaze.com/shows/4/arrow",
        "name" : "Arrow",
        "type" : "Scripted",
        "language" : "English",
        "genres" : [
                "Drama",
                "Action",
                "Science-Fiction"
        ],
        "status" : "Running",
        "runtime" : 60,
        "premiered" : "2012-10-10",
        "officialSite" : "http://www.cwtv.com/shows/arrow",
        "schedule" : {
                "time" : "20:00",
                "days" : [
                        "Monday"
                ]
        },
        "rating" : {
                "average" : 7.6
        },
        "weight" : 99,
        "network" : {
                "id" : 5,
                "name" : "The CW",
                "country" : {
                        "name" : "United States",
                        "code" : "US",
                        "timezone" : "America/New_York"
                }
        },
        "webChannel" : null,
        "externals" : {
                "tvrage" : 30715,
                "thetvdb" : 257655,
                "imdb" : "tt2193021"
        },
        "image" : {
                "medium" : "http://static.tvmaze.com/uploads/images/medium_portrait/165/414895.jpg",
                "original" : "http://static.tvmaze.com/uploads/images/original_untouched/165/414895.jpg"
        },
        "summary" : "<p>After a violent shipwreck, billionaire playboy Oliver Queen was missing and presumed dead for five years before being discovered alive on a remote island in the Pacific. He returned home to Starling City, welcomed by his devoted mother Moira, beloved sister Thea and former flame Laurel Lance. With the aid of his trusted chauffeur/bodyguard John Diggle, the computer-hacking skills of Felicity Smoak and the occasional, reluctant assistance of former police detective, now beat cop, Quentin Lance, Oliver has been waging a one-man war on crime.</p>",
        "updated" : 1536062117,
        "_links" : {
                "self" : {
                        "href" : "http://api.tvmaze.com/shows/4"
                },
                "previousepisode" : {
                        "href" : "http://api.tvmaze.com/episodes/1426875"
                },
                "nextepisode" : {
                        "href" : "http://api.tvmaze.com/episodes/1473817"
                }
        }
}

من این اطلاعات را با اجرای دستور findOne دریافت کرده ام. همانطور که مشاهده می کنید این داده ها اطلاعاتی راجع به سریال ها و فیلم های سینمایی است. مثلا سند بالا در مورد سریال arrow است که اطلاعات سال ساخت، تعداد قسمت ها، کشور سازنده و غیره را مشخص می کند.

برای شروع یادگیری در مورد اپراتور ها همیشه می توانید به documentation رسمی MongoDB مراجعه کنید:

https://docs.mongodb.com/manual/reference/operator/

با ورود به لینک بالا انواع این اپراتور ها را خواهید دید. ما با query operator ها کار داریم بنابراین روی اولین لینک که Query and Projection Operators ها است کلیک کنید. من فعلا با projection operator ها کاری نداریم بنابراین در صفحه جدید روی Query Selectors کلیک کنید. با این کار انواع اپراتور های query را مشاهده خواهید کرد. این صفحه را در جایی ذخیره کنید که همیشه با خودتان داشته باشید.

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

use movieData

سپس وارد collection خودمان می شویم و اولین کوئری خود را اجرا می کنیم:

db.movies.find({runtime: {$eq: 60}})

اپراتور eq مخفف equal است (یعنی «برابر») بنابراین دستور بالا می گوید از بین فیلم ها، آن فیلم هایی را به من برگردان که خصوصیت runtime در آن ها برابر 60 است. البته نوشتن این دستور به شکل بالا اضافه کاری است. ما می توانیم آن را به شکل خلاصه زیر هم کدنویسی کنیم:

db.movies.find({runtime: 60})

این دستور هم یعنی فیلم هایی که runtime برابر 60 باشد. بنابراین به ندرت از eq$ استفاده می کنیم.

اپراتور بعدی ما ne است که مخفف not equal (به معنی «برابر نیست») می باشد. مثال:

db.movies.find({runtime: {$ne: 60}})

با اجرای این کد، تمام فیلم هایی که مدت زمان آن ها (runtime) برابر 60 نباشند، برگردانده می شوند (چه بیشتر از 60 چه کمتر از 60، فقط مهم است که 60 نباشد). من نتیجه این کد ها را برای شما قرار نمی دهم چرا که طول آن ها بسیار بسیار طولانی است. در ضمن برای نمایش بهتر نتیجه می توانید از pretty استفاده کنید:

db.movies.find({runtime: {$ne: 60}}).pretty()

اپراتور بعدی ما lt$ است که مخفف less than (به معنی «کمتر از») می باشد. آیا می توانید کد زیر را ترجمه کنید؟

db.movies.find({runtime: {$lt: 40}})

احتمالا درست حدس زده اید. کوئری بالا می گوید تمام فیلم ها و سریال هایی را که runtime آن ها کمتر از 40 است را به ما برگردان. مثلا یکی از ده ها نتایج برگردانده شده به ما پس از اجرای کوئری بالا بدین شکل است:

{
        "_id" : ObjectId("5e8d82a8fed9c9b1e19c654f"),
        "id" : 77,
        "url" : "http://www.tvmaze.com/shows/77/the-middle",
        "name" : "The Middle",
        "type" : "Scripted",
        "language" : "English",
        "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"
                }
        },
        "webChannel" : null,
        "externals" : {
                "tvrage" : 20678,
                "thetvdb" : 95021,
                "imdb" : "tt1442464"
        },
        "image" : {
                "medium" : "http://static.tvmaze.com/uploads/images/medium_portrait/0/562.jpg",
                "original" : "http://static.tvmaze.com/uploads/images/original_untouched/0/562.jpg"
        },
        "summary" : "<p>Forget about athletes, movie stars and politicians. Parents are the real heroes - but we think Frankie Heck, must be some kind of superhero. A loving wife and mother of three, she's middle class in the middle of the country and is rapidly approaching middle age.</p><p>Frankie and her husband, Mike, have lived in Orson, Indiana, their whole lives. A man of few words (every one a zinger), Mike is a manager at the town quarry and Frankie is the third-best used car salesman (out of the three) at the local dealership. She may not be a high-powered career woman, but when it comes to her family, she'll go to just about any length. And with kids like these, she had better. There's Axl, her semi-nudist teenage son conceived while under the influence of Guns N' Roses; Sue, the awkward teenage daughter who fails at everything... but with the utmost of gusto; and their seven-year-old son Brick, whose best friend is his backpack.</p><p>Sometimes it seems like everyone is trying to get to the top, or struggling not to hit bottom, but we think Frankie and her family will find a lot of love, and a lot of laughs, somewhere in <b>The Middle</b>.</p>",
        "updated" : 1534160100,
        "_links" : {
                "self" : {
                        "href" : "http://api.tvmaze.com/shows/77"
                },
                "previousepisode" : {
                        "href" : "http://api.tvmaze.com/episodes/1464458"
                }
        }
}

همانطور که می بینید مقدار runtime کمتر از 40 است.

اپراتور بعدی ما lte$ است که مخفف less than or equal (کمتر از یا برابر با) می باشد. مثال:

db.movies.find({runtime: {$lte: 40}}).pretty()

این کوئری می گوید runtime برابر 40 یا کمتر باشد در صورتی که در کوئری قبل که lt$ بود خودِ 40 حساب نمی شود و فقط اعداد کمتر از آن (39 و کمتر) محاسبه خواهند شد. اپراتور های gt و gte نیز به همین صورت هستند: gte$ یعنی greater than or equal (بزرگ تر از یا برابر با) بنابراین دوباره آن ها را توضیح نمی دهم.

تمام فصل‌های سری ترتیبی که روکسو برای مطالعه‌ی دروس سری دوره جامع آموزش MongoDB توصیه می‌کند:
نویسنده شوید
دیدگاه‌های شما

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

مقالات مرتبط
آخرین سوالات کاربران
5451218 در 4 سال قبل پرسیده:
ما را دنبال کنید
اینستاگرام روکسو تلگرام روکسو ایمیل و خبرنامه روکسو