آشنایی با اپراتورهای element در MongoDB

Element Operators in MongoDB

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

حالا که با اپراتورهای منطقی در MongoDB آشنا شده ایم نوبت به اپراتورهای element در MongoDB است که تنها دو عدد هستند: exists$ و type$ که در مورد هر دوی آن ها صحبت خواهیم کرد. برای اینکه با این اپراتورها آشنا شویم باید یک پایگاه داده جدید را بسازیم بنابراین می گویم:

use user

سپس یک collection جدید به نام users می سازیم و چند نفر را در آن وارد می کنم:

db.users.insertMany([{name: "Amir", hobbies: [{title: "programming", frequency: 3}, {title: "Gym", frequency: 6}], phone: 059732894409174}, {name: "Nastaran", hobbies: [{title: "Reading", frequency: 5}, {title: "Movies", frequency: 7}], phone: "352380532895", age: 30}])

در اینجا من با استفاده از insertMany دو کاربر را وارد این collection کرده ام که یک name و یک فیلد hobbies (سرگرمی ها) دارند که البته یک آرایه است. همچنین کاربر اول phone (شماره تلفن) خود را به صورت عدد ذخیره کرده است و کاربر دوم به صورت یک رشته ذخیره کرده است. کاربر دوم یک فیلد age (سن) اضافه نیز دارد که کاربر اول ندارد. برای بهتر دیدن این داده ها باید دستور زیر را اجرا کنیم:

db.users.find().pretty()

با اجرای این دستور داده های زیر را می گیریم:

        "_id" : ObjectId("5eb295a448ff1d422538a355"),
        "name" : "Amir",
        "hobbies" : [
                {
                        "title" : "programming",
                        "frequency" : 3
                },
                {
                        "title" : "Gym",
                        "frequency" : 6
                }
        ],
        "phone" : 59732894409174
}

        "_id" : ObjectId("5eb295a448ff1d422538a356"),
        "name" : "Nastaran",
        "hobbies" : [
                {
                        "title" : "Reading",
                        "frequency" : 5
                },
                {
                        "title" : "Movies",
                        "frequency" : 7
                }
        ],
        "phone" : "352380532895",
        "age" : 30
}

من از عمد داده های خودم را بدین شکل ساخته ام تا بتوانیم با اپراتورهای exists$ و type$ کار کنیم. اپراتور exists (به معنی «وجود دارد») به ما کمک می کند تا متوجه شویم که آیا فیلد مورد نظر ما در یک document وجود دارد یا خیر. به طور مثال می توان گفت:

db.users.find({age: {$exists: true}}).pretty()

یعنی در کالکشن users به دنبال document هایی بگرد که در آن ها فیلد age وجود داشته باشد. با اجرای دستور بالا، مقدار زیر را دریافت می کنیم:

        "_id" : ObjectId("5eb295a448ff1d422538a356"),   
        "name" : "Nastaran",                            
        "hobbies" : [                                   
                {                                       
                        "title" : "Reading",            
                        "frequency" : 5                 
                },                                      
                {                                       
                        "title" : "Movies",             
                        "frequency" : 7                 
                }                                       
        ],                                              
        "phone" : "352380532895",                       
        "age" : 30                                      
}                                                       

بنابراین کد ما به درستی کار می کند. ما می توانستیم کد بالا را به صورت زیر نیز بنویسیم:

db.users.find({age: {$exists: false}}).pretty()

با این کار، کاربر دیگر (Amir) را دریافت می کردیم چرا که فیلد Age برای آن کاربر تعریف نشده بود. البته ما می توانیم این اپراتور را با اپراتورهای دیگر نیز ترکیب کنیم. مثلا:

db.users.find({age: {$exists: true, $gt: 30}}).pretty()

یعنی فیلد age وجود داشته و از 30 نیز بزرگ تر باشد. سن Nastaran برابر 30 است و از 30 بزرگتر نیست بنابراین کد بالا چیزی را برنمی گرداند. برای حل این مشکل می توانیم از اپراتور gte$ (مخفف greater than or equal to - بزرگ تر یا مساوی) استفاده کنیم.

برای ادامه کار باید یک کاربر دیگر را نیز در collection خود اضافه کنیم:

db.users.insertOne({name: "Ahmad", hobbies: [{title: "Counceling", frequency: 100}, {title: "Farming", frequency: 7}], phone: "3131031385734943", age: null})

نکته قابل توجه در کد بالا خصوصیت age است که روی null گذاشته می شود. بنابراین age وجود دارد اما مقدارش null است. حالا اگر کد زیر را اجرا کنیم چه می شود؟

db.users.find({age: {$exists: true}}).pretty()

با اجرای این کد علاوه بر Nastaran، فیلد Ahmad نیز به ما برگردانده خواهد شد:

        "_id" : ObjectId("5eb295a448ff1d422538a356"),
        "name" : "Nastaran",
        "hobbies" : [
                {
                        "title" : "Reading",
                        "frequency" : 5
                },
                {
                        "title" : "Movies",
                        "frequency" : 7
                }
        ],
        "phone" : "352380532895",
        "age" : 30
}

        "_id" : ObjectId("5eb299c448ff1d422538a357"),
        "name" : "Ahmad",
        "hobbies" : [
                {
                        "title" : "Counceling",
                        "frequency" : 100
                },
                {
                        "title" : "Farming",
                        "frequency" : 7
                }
        ],
        "phone" : "3131031385734943",
        "age" : null
}

به نظر شما چرا اینطور می شود؟ به دلیل اینکه null یعنی مقداری برای فیلد ما وجود ندارد اما exists خود فیلد را چک می کند نه مقدار درون آن را! بنابراین Ahmad نیز برگردانده می شود؛ در Ahmad یک فیلد به نام age وجود دارد که فعلا مقداری ندارد. برای حل این مسئله باید بگوییم:

db.users.find({age: {$exists: true, $ne: null}}).pretty()

اگر یادتان باشد اپراتور ne مخفف not equal (برابر نیست با) بود بنابراین در اینجا گفته ایم که age وجود داشته باشد اما null نباشد. این اپراتور exists بود که کار با آن بسیار ساده است اما حالا نوبت به type می رسد.

اگر یادتان باشد phone (شماره تلفن) های دو کاربر را به صورت رشته و شماره کاربر Amir را به صورت عددی ذخیره کردیم. اپراتور type$ به معنی «نوع» به ما کمک می کند تا نوع داده درون یک فیلد را مشخص کنیم و از آنجایی که phone برای کاربران ما نوع یکسانی ندارد می توان گفت:

db.users.find({phone: {$type: "number"}}).pretty()

خروجی کد بالا به شکل زیر خواهد بود:

        "_id" : ObjectId("5eb295a448ff1d422538a355"),
        "name" : "Amir",
        "hobbies" : [
                {
                        "title" : "programming",
                        "frequency" : 3
                },
                {
                        "title" : "Gym",
                        "frequency" : 6
                }
        ],
        "phone" : 59732894409174
}

number یکی از تایپ های موجود در Mongo DB است که به صورت خلاصه شامل تمام اعداد integer (اعداد صحیح) و Float (اعداد اعشاری) می شود. کد بالا کاربر Amir را به ما می دهد. از آنجایی که shell بر اساس جاوا اسکریپت است، تمام اعداد ما به عنوان float در نظر گرفته می شوند بنابراین کد زیر نیز کاربر Amir را برمی گرداند:

db.users.find({phone: {$type: "double"}}).pretty()

قبلا در رابطه با float بودن اعداد در جاوا اسکریپت صحبت کرده بودم بنابراین صحبت های گذشته را تکرار نمی کنم. همچنین شما می توانید چندین تایپ را همزمان مشخص کنید. برای این کار باید به type$ یک آرایه را پاس بدهید. مثلا:

db.users.find({phone: {$type: ["double", "string"]}}).pretty()

یعنی document هایی را برگردان که در آن ها نوع داده ذخیره شده در phone برابر double یا string باشد. با اجرای این کد هر سه کاربر ما برگردانده می شوند. ما قبلا در مورد تایپ ها صحبت کرده ایم (گرچه که چند مورد محدود باقی مانده است) اما اگر می خواهید تمام تایپ های موجود را ببینید باید به صفحه رسمی از documentation وب سایت mongodb سر بزنید:

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

در آنجا خواهید دید که انواع داده ها مانند Double و String و Object و Array و Undefined و غیره وجود دارد و می توانید از هر کدام که خواستید استفاده کنید.

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

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

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