Hadi Varposhti
Hadi Varposhti
خواندن ۶ دقیقه·۲ سال پیش

۸ کوئری کاربردی در MongoDB

شما احتمالا کلمه Nosql رو زیاد شنیدین، NoSQL یا همون پایگاه داده غیر رابطه ای که اگر بخوایم معنی دقیقترش رو بگیم میشه ( نه فقط SQL) به این مفهوم که پایگاه های داده غیر رابطه ای امکان پیشتیبانی از SQL رو دارند اما لزوما رابطه ای عمل نمیکنند.

همیشه بنظرم نوشتن مسائل کاربردی بیشتر بدرد میخوره برای همین سعی کردم تا ازچیزهایی بگم که نیاز واقعی در پروژه های واقعی بودن، اینبار بعد از مدتها میخوام راجع به یکی دیگه از پایگاه های داده NoSQL بگم که میتونه همیشه یکی از گزینه های کاربردی باشه براتون.اینبار میخوام در رابطه با Mongodb و ۸ تا از کوئری های کاربردی اون براتون بنویسم.

امیدوارم که براتون مفید باشه (:

پایگاه های داده و نیازسنجی :

پایگاه داده NoSql روش های مختلفی برای ذخیره سازی داده ها استفاده میکنن، که بسته به نیاز پروژه مشخص میشه چه نوعی کاربردی تر مثل، جفت key-value، گراف، داکیومنت، ... . پایگاه داده NOSql مختلفی هم وجود دارند که یکی از معروف ترین اونها MongoDB هستش.

پایگاه داده مونگو، پایگاه داده ای که اطلاعات رو بصورت داکیومنت در خودش ذخیره میکنه و هر داکیومنت در مونگو شامل جفت (field -- value) . داکیومنت ها رو درون ساختاری به نام کالکشن قرار میگیرن. در مقام مقایسه داکیومنت ها به عنوان row و کالکشن ها به عنوان همه table در دیتابیس های ریلیشنال هستند.

کوئری های کاربردی :

خب در مرحله اول بیاین تصور کنیم که کالکشنی به اسم "customer" داریم که شامل فیلدهایی مثل اسم، سن ، جنسیت و مقدار آخرین خرید.

{ &quot_id&quot : ObjectId(&quot600c1806289947de938c68ea&quot), &quotname&quot : &quotJohn&quot, &quotage&quot : 32, &quotgender&quot : &quotmale&quot, &quotamount&quot : 32 } پینوشت: درمورد مفاهیم کلی پیش فرض رو بر این گذاشتم که با اونها اشنایی اولیه رو دارین اما درصورتی که جایی پیچیده بود توی کامنت ها برام بنویسین تا براتون توضیح بدم.

مثال ۱:

پیدا کردن داکیومنت مرتبط با یک کاربر خاص؛ فرض کنین میخوایم داکیومنت مربوط به یک کاربر رو پیدا کنیم برای اینکار باید فیلد name در کوئری find استفاده کنیم

باید اضافه کنم که کلمه pretty و یا درسترش متد pretty باعث میشه تا جواب کوئری شما بصورت زیر باشه که باعث خوانایی بهتر جواب میشه.

> db.customer.find( {name: &quotJohn&quot} ).pretty() { &quot_id&quot : ObjectId(&quot600c1806289947de938c68ea&quot), &quotname&quot : &quotJohn&quot, &quotage&quot : 32, &quotgender&quot : &quotmale&quot, &quotamount&quot : 32 }

مثال ۲ :

پیدا کردن داکیومنت کاربران بزرگتر از ۴۰ سال ؛ بیاین فرض کنیم که دنبال کاربری هستم که سنش بزرگتر از ۴۰ سال، برای اینکار از آرگومان "gt$" به معنی ( بزرگتر از ) استفاده میکنیم.

> db.customer.find( {age: {$gt:40}} ).pretty() { &quot_id&quot : ObjectId(&quot600c19d2289947de938c68ee&quot), &quotname&quot : &quotJenny&quot, &quotage&quot : 42, &quotgender&quot : &quotfemale&quot, &quotamount&quot : 36 }

مثال ۳:

و برای پیدا کردن داکیومنت کاربران کوچکتر از ۲۵ سال و جنسیت اونها (زن ) باشه ؛ بیاین فرض کنیم که دنبال کاربری هستم که سنش کوچکتر از ۲۵ سال و جنسیتش زن ، برای اینکار باید از دستور "and" استفاده کنیم تا بتونیم هردو شرط رو لحاظ کنیم. همچنین یادتون باشه که آرگومان "lt$" به معنی ( کوچکتر از ) که بما کاربران کمتر از ۲۵ سال رو بر میگردونه.

> db.customer.find( {gender: &quotfemale&quot, age: {$lt:25}} ).pretty() { &quot_id&quot : ObjectId(&quot600c19d2289947de938c68f0&quot), &quotname&quot : &quotSamantha&quot, &quotage&quot : 21, &quotgender&quot : &quotfemale&quot, &quotamount&quot : 41 } { &quot_id&quot : ObjectId(&quot600c19d2289947de938c68f1&quot), &quotname&quot : &quotLaura&quot, &quotage&quot : 24, &quotgender&quot : &quotfemale&quot, &quotamount&quot : 51 }

مثال ۴:

توی این مثال همون مثال قبل رو میخوام تکرار کنم با این تفاوت که اینبار از آرگومان "and" هم میخوام داخل کوئریم استفاده کنم.

> db.customer.find( {$and :[ {gender: &quotfemale&quot, age: {$lt:25}} ]} ).pretty()

احتمالا میدونین که از آرگومان "and" برای ترکیب شروط استفاده میشه به این صورت که هر دوشرط باید حتما برقرار باشن. مابقی شرطمون هم مثل مثال قبل با این تفاوت که باید شروط مون رو حتما به صورت ارایه " [ ] " تعریف کنیم.

مثال ۵:

اینبار میخوام کوئری بنویسم که تمامی مشتریانی که جنسیتشون اقا یا سنشون کمتر از ۲۵ سال بمن برگردونه.

توی این مثال میخوام که بهتون نمونه ای کوئری ترکیبی رو نشون بدم که با کمک آرگومان "OR" انجام میشه، توی این مثال کافیه که مثل قبل به جای "and" از "or" استفاده کنیم.

> db.customer.find( { $or: [ { gender: &quotmale&quot }, {age: { $lt: 22}} ] }) { &quot_id&quot : ObjectId(&quot600c1806289947de938c68ea&quot), &quotname&quot : &quotJohn&quot, &quotage&quot : 32, &quotgender&quot : &quotmale&quot, &quotamount&quot : 32 } { &quot_id&quot : ObjectId(&quot600c19d2289947de938c68ed&quot), &quotname&quot : &quotMartin&quot, &quotage&quot : 28, &quotgender&quot : &quotmale&quot, &quotamount&quot : 49 } { &quot_id&quot : ObjectId(&quot600c19d2289947de938c68ef&quot), &quotname&quot : &quotMike&quot, &quotage&quot : 29, &quotgender&quot : &quotmale&quot, &quotamount&quot : 22 } { &quot_id&quot : ObjectId(&quot600c19d2289947de938c68f0&quot), &quotname&quot : &quotSamantha&quot, &quotage&quot : 21, &quotgender&quot : &quotfemale&quot, &quotamount&quot : 41 }

مثال ۶ :

يکی دیگه از نکات مهمی که باید بهش اشاره کنم، امکان تجمیع مقادیر یا "aggregation" در mongodb هستش.برای مثال میخوام مجموع مقدار خرید تمام مشتریان زن و مرد محاسبه کنم کافیه تا از متد aggregate استفاده کنم و کوئری بشکل زیر بنویسمش.

> db.customer.aggregate([ ... { $group: {_id: &quot$gender&quot, total: {$sum: &quot$amount&quot} } } ... ]) { &quot_id&quot : &quotfemale&quot, &quottotal&quot : 198 } { &quot_id&quot : &quotmale&quot, &quottotal&quot : 103 }

خب بزارین تا کوئری بالا رو یکم بیشتر توضیح بدم. در مرحله اول، اومدم با استفاده از ستون "gender$"گروپ کردم به عنوان id، و قسمت دوم هم تابع مدنظرمون و ستونی که باید تجمع بشه که "sum$" در مثال ماست.

مثال ۷:

حالا بیاین یه قدم جلوتر بریم و به مثال قبل شرط هم اضافه کنیم.برای اینکار اول شرط مون رو با استفاده از دستور "match" مینویسیم وبعد aggregation رو روی اون اجرا میکنیم.

تو مثال زیر اول میایم تمام مشتریای بزرگتر از ۲۵ سال رو انتخاب میکنیم و بعد مجموع مقدار خریدشون رو محاسبه میکنیم.

> db.customer.aggregate([ ... { $match: { age: {$gt:25} } }, ... { $group: { _id: &quot$gender&quot, avg: {$avg: &quot$amount&quot} } } ... ]) { &quot_id&quot : &quotfemale&quot, &quotavg&quot : 35.33 } { &quot_id&quot : &quotmale&quot, &quotavg&quot : 34.33 }

مثال ۸ :

مرتب سازی ( sort )، در مثال قبل جواب کوئری ما دو رکورد بود برای همین اجباری به مرتب سازی جواب ها نبود اما ممکن شما به کوئری بر خورد کنین که چندین رکورد جواب داشته باشه در این صورت لازم که اونها رو مرتب کنین که برای اینکار بصورت زیر عمل میکنیم.

نکته ای که باید اضافه کنیم اینکه مقدار ۱ که میبینین برابر با مرتب سازی بصورت asc و مقدار ۱- برابر با مرتب سازی به صورت desc.

> db.customer.aggregate([ ... { $match: { age: {$gt:25} } }, ... { $group: { _id: &quot$gender&quot, avg: {$avg: &quot$amount&quot} } }, ... { $sort: {avg: 1} } ... ]) { &quot_id&quot : &quotmale&quot, &quotavg&quot : 34.33 } { &quot_id&quot : &quotfemale&quot, &quotavg&quot : 35.33 }

جمع بندی:

در دنیای اطلاعات امروز مهم که بدونین چطوری با اطلاعاتی که میاد ستتون رفتار کنین تا بهترین جواب و بگیریم. برای این کار هم باید پایگاه داده ها رو خوب بشناسین، مهم نیست که sql و یا nosql باشه .من سعی کردم تا مفاهیم اولیه رو در پایگاه داده mongo رو بهتون معرفی کنم اما مسلما برای پیشرفت نیاز دارین تا خودتون رو درگیر مسائل پیچیده تر هم بکنین.

مثل همیشه خوشحال میشم که فیدبک هاتون رو برام بنویسین، تا نواقص کارم رو برطرف کنم.

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

شاد باشین (:

پایگاه دادهmongodbnosqlکوئری
سعی میکنم چیزی رو بنویسم که نیاز آدما باشه
شاید از این پست‌ها خوشتان بیاید