آموزش تکنولوژی MEAN

با سلام خدمت شما عزیزان
من بهزاد خلیلی و دوست خوبم حمیدرضا صدیق می خواهیم در این وبلاگ تکنولوژی MEAN را یه فارسی زبانان علاقه مند معرفی کنیم.
فریم ورک MEAN یک فریم ورک کامل (Full Stack) جاوا اسکریپت برای توسعه دهندگان وب است که در سالهای اخیر توانسته در برابر LAMP خودی نشان دهد.

طبقه بندی موضوعی
بایگانی
نویسندگان

۵ مطلب در آذر ۱۳۹۴ ثبت شده است


با سلام خدمت شما عزیزان

در آموزش قبلی با ساختار کلی دستور find و اینکه چگونه خروجی را مرتب کنید آشنا شدید، امروز می خواهیم در دستور find شرط بگذاریم. شرط گذاشتن در Mongo DB کلا با چیزی که در SQL بلد هستید متفاوت است.

خوب من اول می خوام عملگرد ها  را معرفی کنم بعدا در Mongo DB اجرا کنم.

عملگر

Mongo DB

SQL

Equality – مساوی

{"Key": "Value"}

Where key='Value'

Less Then – کوچکتر از

{"Key":{$lt : "Value"}}

Where Key<'Value'

Less Then Equals – کوچکتر مساوی

{"Key":{$lte : "Value"}}

Where Key<='Value'

 Greater Then – بزرگتر از

{"Key":{$gt : "Value"}}

Where Key>'Value'

Greater Then Equals – بزرگتر مساوی

{"Key":{$gte : "Value"}}

Where Key>='Value'

No Equals – نا مساوی

{"Key":{$ne : "Value"}}

Where key!='Value'

 

خوب همان طور که در جدول بالا ملاحظه می کنید، مخفف نام عملگرد در دستورات استفاده می شود، البته به غیر از مساوی. من بار اول که این عملگرد ها را دیدم کلا پشیمون شدم از خوندم Mongo DB اما بعد که فهمیدم این عملگردها سر کلمه چه کلمه هایی هستند خیالم راحت شد، چون فهمیدم نیاز به حفظ کردن نداره.


تمامی سند هایی که در مجموعه Letter ذخیره شده است:



سند هایی را نمایش دهد که مقدار LetterNo آنها برابر با 1 است :



سند هایی را نمایش دهد که مقدار LetterNo آنها کوچکتر از 2 است:



سند هایی را نمایش دهد که مقدار LetterNo آنها کوچکتر مساوی از 2 هستند:



سند هایی را نمایش دهد که مقدار LetterNo آنها بزرگتر از 4 هستند:



سند هایی را نمایش دهد که مقدار LetterNo آنها بزرگتر مساوی از 4 هستند:



سند هایی را نمایش دهد که مقدار LetterNo آنها مخالف 4 است:



خوب دوستان این قسمت هم به اتمام رسید، چون دستور find خیلی مهم است می خواهم چند قسمت شود که هم شما بیشتر تمرین کنید هم من بتونم بهتر توضیح دهم.

فعلا خدا نگهدار

بهزاد خلیلی
۱۳ آذر ۹۴ ، ۱۲:۴۷ موافقین ۳ مخالفین ۰ ۱ نظر

سلام دوستان از اینکه بازم تاخیر داشتم معذرت می خوام.

امروز می خواهم راجب دستور find خدمتتان صحبت کنم، این دستور معادل دستور select در SQL Server است، اما به جرات می تونم بگم با قدرت بیشتر. زمانی که من SQL Server و یاد می گرفتم استادم (مهندس وحید عباس زاده) می گفت SQL کار خوب کسی هست که بتونه Select خوبی بنویسه، واقعا درستش هم همین بود و هست، شما هرچیزی که بخواهی بنویسی که پیچیده است مجبوری با Select بنویسی، مثلا یک Update با کلی ریزه کاری یا SP یا FN و ... . در Mongo DB هم همینطور است، Find دستور خیلی مهمی است و خیلی خیلی خیلی ریزه کاری داره بخاطر همین این دستور و می خوام تو چند قسمت آموزش بدم.

خوب دوستان اول دستور و به صورت های ساده عرض می کنم و در قسمت های بعدی نکات دیگر را خدمتتان عرض می کنم.


 

 

خوب همان طور که ملاحظه می کنید دستور بالا تمامی سند هایی که در مجموعه letter ما ذخیره کرده بودیم و نمایش داد. اما چند نکته اول اینکه ما در درج سند ها ستون _id نداشتیم اما در نمایش همیچین ستونی داریم، دومین موردی که الان نیاز هست بدونید اینه که دستور بالا درسته تمامی اطلاعات را نمایش می دهد اما واضح نیست و اطاعات به قولی تو حلق هم هستن و موقع خوندن چشم امکان خطا دارد.

راجب نکته اول باید خدمتتان عرض کنم که شما هنگام درج هر سند خود Mongo DB به صورت پیش فرض یک _id  به آن تعلق می دهد که یک عدد غیر قابل تکراری است. شما نمی توانید دو سند ثبت کنید که _id آن با دیگری یکی باشد.

 

خطای بالا مربوط به این است که می خواستیم دو سند را با یک _id ذخیره کنیم.

 

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

 

فکر می کنم تصویر بالا گویای کامل جریان است ! چقدر سند ها مرتب و با یه ساختار منظم نمایش داده شدند.

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

خدا نگهدار

 

 

بهزاد خلیلی
۱۰ آذر ۹۴ ، ۲۳:۵۸ موافقین ۳ مخالفین ۰ ۲ نظر

سلام دوستان

 

امیدوارم تا این لحظه آموزش هایی که خدمتتان ارائه کرده ام، مفید واقع شده باشد.

در این قسمت می خواهم JSON  و ثبت سند در بانک اطلاعاتی را خدمتتان ارائه کنم.

خوب آموزش خودم را با این سوال شروع می کنم که JSON چیست؟

JSON مخفف کلمات JavaScript Object Notation است. به این معنی که " نشانه گذاری شی در جاوا اسکریپت " است.

برای ساخت عبارات JSON چند قانون ساده وجود دارد :

عبارت های JSON باید میان آکولاد "{}" قرار بگیرند.

        اعضای شی باید با ویرگول "", از هم جدا شوند.

       برای تعریف یک عضو در یک شی، ابتدا باید " نام عضو " سپس " دو نقطه "

              و در پایان  " مقدار "  آن نوشته می شود.

        مقدار می تواند یکی از انواع (عددی، رشته، بولی، آرایه،

              شی و NULL )باشد. سایر  مقادیر باید به صورتی دیگر ذخیره شوند.

       انواع رشته ها باید داخل دو گیومه (")  قرار بگیرند.

 

JSON یک راه مناسب برای نگهداری اطلاعات است و از لحاظ ساختاری شباهت زیادی به XML رقیب قدیمی خود دارد.

 

ساختار JSON را مجموعه ای از (مقدار : نام ) تشکیل می دهد. ساختار مشابه آن در زبان سی شارپ KeyValuePair است.

 

یک مثال خیلی ساده برای درک بهتر موضوع:

 

یک شی با ساختار زیر در سی شارپ داشته باشیم :

class Customer

    {

        public int Id { get; set; }

        public string FirstName { get; set; }

        public string LastName { get; set; }

    }

          ساختار JSON متناظر با آن ( در صورتی که مقدار دهی شده باشد) به صورت زیر است:

{

   "Id":1,

   "FirstName":"John",

   "LastName":"Doe"

}

 

همان طور که در بالا مشاهده می کنید در ساختار JSON تمامی قانون هایی که در بالا ذکر کرده ایم رعایت شده است.

 

خوب حالا میریم سر اصل مطلب ثبت سند در Mongo DB.

 

ساختار کلی دستور :

> db.Collection_Name.insert()

خوب یادتون هست در آموزش قبلی که مربوط به Collection ها بود عرض کردم که ما همیشه نیازی به ساخت مجموعه نداریم؟

 

وارد محیط Mongo DB می شویم :


 

     خوب همین طور که مشاهده می کنید ما یک مجموعه بیشتر نداریم اما سندی که می خواهیم الان ثبت کنیم مربوط به مکاتبات روزانه است و نیاز به مجموعه letter داریم، خوب ما عادت کرده بودیم اول جدول بسازیم بعدا رکورد ثبت کنیم درسته؟اما من در اینجا نمی خوام مجموعه letter رو بسازم! یعنی چی؟ یکم صبر کنید تا با هم یک اتفاق شگفت انگیز رو ببینیم :

 


 

  در تصویر بالا چند تا نکته وجود دارد.همان طور که مشاهده می کنید ما مجموعه letter نداریم اما می خواهیم یک سند در این مجموعه قرار دهیم و دستور Insert  را اجرا کردیم، در اینجا خود Mongo DB چک کرده و متوجه شده که ما همچین مجموعه ای نداریم و اول آن را ساخته سپس آن سند را در مجموعه به ثبت رسانده است.  این امکان Mongo DB خیلی معرکه است.شما فکر کنید بدون اینکه جایی را در نظر گرفته باشید می گید من این سند را می خوام در این مجموعه ثبت کنم، اونم می گه باشه

چشم و میره این کار را انجام می ده!!!!

 

قوانین نام گذاری مجموعه ها:

    نام مجموعه نمی تواند خالی یا NULL باشد.

    نباید دارای پیشوند  system. باشند، زیرا این مجموعه رزرو شده است.

    مجموعه هایی که توسط کاربران تعریف می شود نباید شامل کاراکتر $ باشد.

 

 

خوب این قسمت آموزش مربوط به قسمت قبلی بود که عرض کردم برای ساخت یک مجموعه 2 را وجود دارد اینم راه دوم و بحث مجموعه به کلی تمام شد.

 

 

   خوب حالا بعد از تعجب کردن راجب مجموعه، تعجب بیشتر آن مربوط به فیلدهای آن سند است، ما الان این مجموعه رو کلا نداشتیم و با دستور ثبت این مجموعه را ساختیم، کی فیلدهای آن را تعریف کردیم؟هیچوقت اینکار را نمی کنیم. قدرت دیتابیس های NoSql در این است که اصلا نیازی به این کار ندارند. می دونم دارید تعجب می کنید اما بذارید یه مثل عمومی بزنم، شما یک حسابدار هستید و فاکتور های فروش شرکت را درون یک زونکن نگه می دارید، شما فاکتوری که پرینت شده را به صورت یکجا و کامل درون زونکن قرار می دهید، اما در برنامه حسابداری برای نگهداری اون اطلاعات یک جدول برای Header فاکتور درست شده، یک جدول برای نام مشتری ها، یک جدول برای آیتم های فاکتور و ..... . این کار یعنی شما فاکتور پرینت شده را تیکه تکیه کنی به هر کدوم یک شماره اختصاص بدی و هر تیکه هم درون یک زونکن قرار بدی. Mongo DB درست و منطقی کار می کند، من خودم از بس SQL کار کرده ام فکر می کردم این عجیب هست اما وقتی بیشتر وقت گذاشتم و خوندم به این نتیجه رسیدم که من اینقدر اون مدلی فکر کردم که از دنیای واقعی به دور شدم و Mongo DB (کلا No Sql ها )داره مثل دنیای واقعی عمل می کند. الان من می تونم خیلی راحت یک سند دیگر با فیلد های متفاوت را در مجموعه letter ذخیره کنم.

 

 

 

حالا خود دستور Insert چه نکاتی دارد؟

 

ترتیب کلید و مقدار آن در سند متفاوت است.(Case-Sensitive  و Type-Sensitive)

 

>db.Collection_Name.Insert({"FirstName":"Behzad",

                                          "LastName":"Khalili"})

>db.Collection_Name.Insert({"LastName":"Khalili",

                                          "FirstName":"Behzad"})

دو سند بالا از نظر Mongo DB کاملا متفاوت می باشند.

 

>db.Collection_Name.insert({"FirstName":"Behzad",

                                          "LastName":"Khalili",

                                           "Age":22})

>db.Collection_Name.insert({"FirstName":"Behzad",

                                          "LastName":"Khalili",

                                          "Age":"young"})

دو سند بالا از نظر Mongo DB کاملا متفاوت می باشند.

 

سندها نمی توانند شامل کلید های تکراری باشند.

>db.Collection_Name.insert({"FirstName":"Behzad",

                                          "FirstName ":"Khalili")

 

شما می توانید یک فیلد را به عنوان آرایه در نظر بگیرید!

 

 

 

همان طور که ملاحظه می کنید فیلد Dayeri به عنوان یک آرایه تعریف شده است. در JSON  برای تعریف یک آرایه از [] استفاده می شود.

 

 این قسمت از آموزش هم به پایان رسید، ما منتظر نظر شما برای بهبود روند آموزشی خود هستیم.

با تشکر   خدا نگهدار

 

بهزاد خلیلی
۰۷ آذر ۹۴ ، ۰۱:۵۹ موافقین ۴ مخالفین ۰ ۴ نظر

سلام دوستان عزیز

   تا به امروز ما سعی کردیم شما را با Mongo DB آشنا کنیم و نحوه نصب و دستورات پر کاربرد و کلی را به شما عزیزان آموزش بدم.

اما از این قسمت به بعد می خواهم دستورات مهم و خدمتتان آموزش بدهم. نحوه آموزشی که من می خواهم شروع کنم به صورت پروژه محور می باشد. یعنی الان یه سناریو برای خودمون تعیین می کنیم و شروع می کنیم به انجام آن  و با چالش های آن روبه رو می شیم و آن ها رو هم رد می کنیم.

سنارویی که می خواهم با هم انجام دهیم :

می خواهیم اطلاعات یک بایگانی را در پایگاه داده خودمون ذخیره کنیم. خوب بایگانی که ما میشناسیم برای سازمانی است که روزی 100 هزار پرونده جدید ثبت می شود و اسناد مختلفی برای ثبت دارد.

خوب ما می تونیم برای اینکار از بانک های RDMBS استفاده کنیم و آن را طوری طراحی کنیم که سندهای مختلف را بتوانیم درونش ثبت کنیم. اما خدا نکنه که بخواهید یه گزارش از سیستم بگیرید می خواهید گریه کنید از پس مجبورید join  بزنید. اما در بانک های NoSql نیاز به این کار ندارید. یعنی حتی نیاز به طراحی کامل بانک اطلاعاتی ندارید. فقط کافیه مجموعه های خود را بسازید. شاید شما هم مثل من چندین سال هست که با  SQL کار کرده اید و این طور فکر کردن و پیاده سازی آن براتون سخت باشه. چون ما عادت کردیم که یه جدول پایه باید داشته باشیم و یه جدول که با اون در رابطه باشه و .... . اما مهم ترین ویژگی بانک های NoSql در این است. بیشتر از این وقت و نمی گیرم و میرم برای شروع کار.

 

اطلاعات سرویس ها  :

اینترنت / اینترانت / MPLS { نام مشترک – نوع سرویس –  شماره قرارداد – تاریخ قرارداد – ظرفیت درخواست شده – دایری {شماره نامه دایری، تاریخ نامه دایری، ظرفیت دایر شده}– مبلغ قرارداد – مدت زمان اجرای قرارداد – نوع ضمانت نامه – مبلغ ضمانتنامه – استان درخواست شده – شهر درخواست شده }

فضا { نام مشترک – نوع سرویس – شماره قرارداد – تاریخ قرارداد – فضا(متر) – مبلغ قرارداد – مدت زمان اجرای قرارداد – نوع ضمانت نامه – مبلغ ضمانتنامه – استان درخواست شده – شهر درخواست شده }

دکل مخابراتی { نام مشترک – نوع سرویس – شماره قرارداد – تاریخ قرارداد – دکل{نوع، زاویه، ارتفاع، قطر} – مبلغ قرارداد – مدت زمان اجرای قرارداد – نوع ضمانت نامه – مبلغ ضمانتنامه – استان درخواست شده – شهر درخواست شده }

مکاتبات روزانه :

                   نام مشترک –نوع سرویس – شماره نامه – تاریخ نامه – سوابق قبلی – سوابق بعدی

 

           خوب فعلا همین اطلاعات برای شروع کافی است. همینطور که مشاهده می کنید سند های بالا هم دارای فیلد ها مشترک هستند اما فیلدهای اختصاصی، طراحی این دیتابیس با بانک های RDMBS امکان پذیر است اما همان طور که بالا عرض کردم کافیه کارفرما یه مدل گزارش خاص از شما بخواهد، من خودم چون به شخصه این تجربه و دارم می دونم چه مشکلاتی پیش میاد.

         

مجموعه هایی که نیاز داریم :

 اطلاعات سرویس ها – اطلاعات مکاتبات روزانه

(یه نکته خیلی جالب من این کار و در حد یه سازمان دولتی بزرگ انجام دادم و الان حدودا یک ساعتی هست دارم فکر می کنم که به چه مجموعه هایی نیاز هست،این کار را در SQL Server با بیش از 6 جدول انجام دادم در صورتی که در اینجا به دو مجموعه بیشتر نیاز نداریم!)

خوب ما 2 روش برای ساخت مجموعه داریم، یکی اینکه از دستوری که امروز خدمتتان عرض می کنم استفاده کنیم، راه دوم اینه که شما به محض اینکه سندی را ذخیره کنید، اگر آن مجموعه از قبل تعریف نشده باشد، اول آن مجموعه را میسازد بعد آن سند را ذخیره می کند.

روش اول را الان خدمتتان توضیح میدم و روش دوم چون نیاز به یکسری موارد دیگر دارد بعدا توضیح می دهم.

 

خوب همان طور که در بالا مشاهده می کنید، من اول وارد محیط Mongo DB شده ام، سپس دیدم در چه دیتابیسی هستم که چون دیتابیسی نساخته ام پیش فرض در test هستم و چون هنوز سندی را ذخیره نکرده ام در show dbs آن را نمی بینم. خوب این توضیحات برای آموزش های قبلی بود.در خط آخر دستوری نوشته شده با این مظنون :

>  Db.createcollection(

"نام مجموعه",{capped:Boolean,autoIndexID:Boolean,size:Number,max:Number})

نام مجموعه : نام مجموعه ای است که قرار ساخته شود و تنها فیلد اجباری هنگام ساخت مجموعه است.

Capped : اگر مقدار این ویژگی را برابر با True قرار دهیم، یک مجموعه با طول ثابت برای ما می سازد که اگر اندازه آن به حداکثر برسد، به صورت اتوماتیک داده های جدید را جایگزین قدیمی ترین داده ها می کند.در ضمن اگر مقدار این ویژگی را برابر با True قرار دادید، ویژگی Size را هم باید مقدار دهی کنید.مقدار پیش فرض این ویژگی False است.

AutoIndexID : همانطور که از نام این ویژگی معلوم است بر روی فیلد ID به صورت اتوماتیک Index قرار می دهد. مقدار پیش فرض این ویژگی False است.

Size : حداکثر سایز مجموعه به بایت است.

Max : حداکثر سندهایی که می توان درون یک مجموعه قرار داد.

 

خوب با این توضیحاتی که الان یادگرفتیم، متوجه شدیم که در کاری که ما می خواهیم انجام دهیم فقط نیاز به ویژگی AutoIndexID است و باقی ویژگی ها در این پروژه  کاربردی ندارند و مقدار دهی نمی کنیم.

 


خوب در اینجا مجموعه ما باهمان ویژگی که ما می خواستیم به ثبت رسید، اما در اینجا یه کار دیگه هم انجام دادیم. یک بانک اطلاعاتی به نام archive ساختم و یعد مجموعه را درون بانکم ساختم. در آموزش های قبلی گفته بودم که با دستور use  می توانید بین بانک های اطلاعاتی سوئیچ کنید، اما در اینجا می بینید که ما با همان دستور use یک بانک اطلاعاتی جدید ساختیم. متوجه شدید چی شد؟ Mongo DB نیازی به تعریف های از قبل نداره! یعنی شما وقتی از دستور use استفاده می کنید، خود Mongo میره ببینه همچین بانکی وجود دارد یا خیر، اگر وجود نداشته باشد آن را می سازد بعد وارد آن بانک می شود.این ویژگی Mongo DB را به خاطر بسپارید چون هم امکان اشتباه دارد هم اینکه خیلی خیلی به کار می آید.الان من اگر دوباره show dbs را اجرا کنم شما بهتر درک می کنید که چه اتفاقی افتاده است .

 

خوب همین کار را برای letter هم انجام می دهیم.

 

از این به بعد می خواهم در هر آموزش یک دستور و به طور کامل توضیح دهم، اگر فکر می کنید این روش آموزش درست نیست و بهتره از روش دیگری استفاده کنم خواهشا در قسمت نظرات بفرمایید تا اون طوری که شما دوست دارید و فکر می کنید بهتر است آموزش بدهم.

خدا نگهدار

 

 

بهزاد خلیلی
۰۶ آذر ۹۴ ، ۰۱:۴۴ موافقین ۴ مخالفین ۰ ۲ نظر

با سلام خدمت دوستان از اینکه این آموزش یکم طول کشید معذرت می خوام، تمام سعی خودم و می کنم که از این به بعد زود به زود وبلاگ بروز کنم.

خوب بریم سراغ آموزش:

خوب همانطور که در آموزش قبلی خدمتتان توضیح دادم، شما باید فولدری به نام data در ریشه درایو C ایجاد نمایید، اما خیلی از ما ها از این نوع محدودیت ها خوشمون نمیاد، خوب برای این کار باید از سوئیچ --dbpath استفاده کنید.

خوب همانطور که در تصویر بالا مشاهده می کنید ما فولدر Data را در جای دیگر از حافظه تعریف کردیم و به Mongo DB گفتیم که از آن فولدر استفاده کند.

خوب ما از اینجا به بعد شروع می کنیم به گفتن دستورات و هر دستور که نکته ی خاصی داشته باشد در همان جا ذکر می کنیم.

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

دستور بعدی که می خواهم خدمتتان عرض کنیم دستور show dbs می باشد. این دستور تمامی پایگاه داده های داخل بانک اطلاعاتی را می توانیم ببنیم. خوب یه نکته! یادتون هست وقتی برای بار اول db  را اجرا کردیم test را دیدیم؟حالا show dbs را که اجرا می کنید باز هم test را می بینید؟نه! پایگاه داده test را خود Mongo DB به ما می دهد اما واقعا فیزیکی وجود ندارد، اگر شما سندی در این پایگاه داده ایجاد نمایید(دستور ایجاد سند را هم می گم) اونوقت مشاهده می کنید کهtest هم در show dbs نمایش داده می شود.

دستور بعدی use {DataBase_Name} می باشد، وظیفه این دستور سوئیچ بین پایگاه های داده است.

دستور پر کاربرد بعدی Show Collections است، این دستور تمام مجموعه های درون پایگاه داده را نمایش می دهد.

آخرین دستوری که می خواهم این جلسه خدمتتان عرض کنم، دستور db.stats() می باشد، این دستور نام پایگاه داده، تعداد مجموعه ها و سند های موجود در پایگاه داده را نمایش می دهد.

خوب به نظرم برای امروز کافیه، شما هم کار کنید و اگر سوالی داشتید به ما بگید که کمکتون کنیم، فعلا خدانگهدار

بهزاد خلیلی
۰۳ آذر ۹۴ ، ۲۱:۴۴ موافقین ۴ مخالفین ۰ ۳ نظر