سلام همگی دوستان.
این مدتی که نیستم دارم روی یک پروژه کامل کار میکنم با استک زیر :
Mongodb (community) , ExpressJs )Mongoose , REST) , ReactJs (MaterialUI , NextJs) , NodeJs
برای هر کدوم از best practice ها و آخرین نسخه استفاده میکنم و پروژه علاوه بر لاگین و داشبورد و پنل مدیریت ، role-based و permission-based هم هست.
ترکیب همه اینارو هیچ جای اینترنت پیدا نخواهید کرد. یا حتی اگر باشه برای چند سال پیشه.
طی هفته های آینده این پروژه تکمیل میشه و به رایگان روی گیت هاب قرار میگیره.
مطمنا ضعف هایی خواهد داشت مخصوصا تو حوزه استایل (خیلی ذوق هنری ندارم😅) ولی مطمنا به خیلی ها میتونه کمک کنه.
این مدتی که نیستم دارم روی یک پروژه کامل کار میکنم با استک زیر :
Mongodb (community) , ExpressJs )Mongoose , REST) , ReactJs (MaterialUI , NextJs) , NodeJs
برای هر کدوم از best practice ها و آخرین نسخه استفاده میکنم و پروژه علاوه بر لاگین و داشبورد و پنل مدیریت ، role-based و permission-based هم هست.
ترکیب همه اینارو هیچ جای اینترنت پیدا نخواهید کرد. یا حتی اگر باشه برای چند سال پیشه.
طی هفته های آینده این پروژه تکمیل میشه و به رایگان روی گیت هاب قرار میگیره.
مطمنا ضعف هایی خواهد داشت مخصوصا تو حوزه استایل (خیلی ذوق هنری ندارم😅) ولی مطمنا به خیلی ها میتونه کمک کنه.
خلاصه تجربیات تلخ این چند روز :
اگر قبلا Sql کار میکردید و الان شیفت دادید به NoSql ، قبل از انجام هر کاری حتما کانسپتهای اصلی و داکیومنت دیتابیس و درایور موردنظرتون رو بخونید.
هر گردی گردو نیست.
اگر قبلا Sql کار میکردید و الان شیفت دادید به NoSql ، قبل از انجام هر کاری حتما کانسپتهای اصلی و داکیومنت دیتابیس و درایور موردنظرتون رو بخونید.
هر گردی گردو نیست.
مقایسه populate و lookup در MongoDB
لینک اصلی :
https://medium.com/cameoeng/mongodb-lookups-and-populates-an-unexpected-journey-940e08e36a94
لینک اصلی :
https://medium.com/cameoeng/mongodb-lookups-and-populates-an-unexpected-journey-940e08e36a94
روی MongoDB اگر میخواهید ببینید که مقدار مورد نظرتون داخل آرایه ای که روی یک فیلد ذخیره شده ، وجود داره یا نه ، سراغ روشهای عجیب غریب نرید. از ویژگی های خود منگو استفاده کنید. برای مثال بالا بنویسید :
db.<collection_name>.find( { tags: "red" } )
خروجیش میشه همه documentهایی که مقدار red یکی از اعضای tags داخلشونه.
ولی حواستون باشه اگر بخواهید بیشتر از یک آیتم رو روی یک آرایه چک کنید باید ترتیب هم رعایت کنید مثلا :
db.<collection_name>.find( { tags: [ "blank", "red" ] } )
برای چک کردن nested object ها هم از همچین سینتکسی برای مثال بالا میتونید استفاده کنید :
db.<collection_name>.find( { "size.uom": "in" } )
در آخر هم برای اینکه فقط چندتا فیلد رو برگردونید میتونید بنویسید :
db.<collection>.find( {}, { _id: 0, item: 1, status: 1 } );
معنی ۱ این میشه که اون فیلد رو برگردون ، صفر هم میشه برنگردون. وقتی از این روش استفاده میکنید همه فیلدها صفر میشه به جز اونا که خودتون ۱ کردید و فیلد _id. برای اینکه فیلد _id هم نیاد باید صریحا مقدارش رو صفر کنید.
نکته : بهتره که مقدار _id رو توی ریسپانس برنگردونید
#mongodb #nosql
db.<collection_name>.find( { tags: "red" } )
خروجیش میشه همه documentهایی که مقدار red یکی از اعضای tags داخلشونه.
ولی حواستون باشه اگر بخواهید بیشتر از یک آیتم رو روی یک آرایه چک کنید باید ترتیب هم رعایت کنید مثلا :
db.<collection_name>.find( { tags: [ "blank", "red" ] } )
برای چک کردن nested object ها هم از همچین سینتکسی برای مثال بالا میتونید استفاده کنید :
db.<collection_name>.find( { "size.uom": "in" } )
در آخر هم برای اینکه فقط چندتا فیلد رو برگردونید میتونید بنویسید :
db.<collection>.find( {}, { _id: 0, item: 1, status: 1 } );
معنی ۱ این میشه که اون فیلد رو برگردون ، صفر هم میشه برنگردون. وقتی از این روش استفاده میکنید همه فیلدها صفر میشه به جز اونا که خودتون ۱ کردید و فیلد _id. برای اینکه فیلد _id هم نیاد باید صریحا مقدارش رو صفر کنید.
نکته : بهتره که مقدار _id رو توی ریسپانس برنگردونید
#mongodb #nosql
نکته : در Mongodb ، مقدار ()Date با ()new Date ظاهر یکسانی دارن ولی از Typeهای مختلفی هستن. اولی String برمیگردونه ولی دومی Date. در واقع اگر دنبال معادلش میگردین مقدار ()new Date دقیقا برابره با ()ISODate
واحد زمانی هم که منگو استفاده میکنه مشابه چیزیه که بقیه حوزه های کامپیوتر ازش استفاده میکنن. در واقع یک استاندارد جهانیه.
تعداد میلی ثانیه ها از مبدا یکم ژانویه ۱۹۷۰ رو به فرم یک signed 64-bit integer برمیگردونه که میتونید به شکل های مختلف فرمتش کنید که مثلا به حالت سال ماه روز یا چیزای مشابه نمایش بده.
#mongodb #nosql
واحد زمانی هم که منگو استفاده میکنه مشابه چیزیه که بقیه حوزه های کامپیوتر ازش استفاده میکنن. در واقع یک استاندارد جهانیه.
تعداد میلی ثانیه ها از مبدا یکم ژانویه ۱۹۷۰ رو به فرم یک signed 64-bit integer برمیگردونه که میتونید به شکل های مختلف فرمتش کنید که مثلا به حالت سال ماه روز یا چیزای مشابه نمایش بده.
#mongodb #nosql
قواعد انتخاب نام در Mongodb :
۱- به بزرگی و کوچکی حروف حساس نیست.
۲- از بعضی کاراکترها در شرایط زیر نمیتوانید استفاده کنید :
الف) اگر منگو روی ویندوز دیپلوی شده است : /\. "$*<>:|?
ب) اگر منگو روی لینوکس و یونیکس بیس ها دیپلوی شده است : /\. "$
۳- نمیتواند شامل فضای خالی باشد
۴- حداکثر ۶۴ کاراکتر
۵- اسامی باید با یک _ یا حرف شروع شود و نمیتواند شامل موارد زیر باشد :
الف) $ ( اسامی فیلدها نباید با این شروع شوند)
ب) رشته خالی
ج) null
د) نمیتواند با کلمه system شروع شود.
نکته خیلی مهم : قواعد نام گذاری در منگو مثل زبانهای برنامه نویسی یک قاعده کلی نیست. و برای اسامی دیتابیس ها ، کالکشنها و فیلدها قواعد متفاوتی وجود دارد و ۵ مورد بالا در واقع اشتراک این قوانین است. سعی کنید از همین قواعد مشترک استفاده کنید تا بعدا سردرگم نشوید.
#mongodb #nosql
۱- به بزرگی و کوچکی حروف حساس نیست.
۲- از بعضی کاراکترها در شرایط زیر نمیتوانید استفاده کنید :
الف) اگر منگو روی ویندوز دیپلوی شده است : /\. "$*<>:|?
ب) اگر منگو روی لینوکس و یونیکس بیس ها دیپلوی شده است : /\. "$
۳- نمیتواند شامل فضای خالی باشد
۴- حداکثر ۶۴ کاراکتر
۵- اسامی باید با یک _ یا حرف شروع شود و نمیتواند شامل موارد زیر باشد :
الف) $ ( اسامی فیلدها نباید با این شروع شوند)
ب) رشته خالی
ج) null
د) نمیتواند با کلمه system شروع شود.
نکته خیلی مهم : قواعد نام گذاری در منگو مثل زبانهای برنامه نویسی یک قاعده کلی نیست. و برای اسامی دیتابیس ها ، کالکشنها و فیلدها قواعد متفاوتی وجود دارد و ۵ مورد بالا در واقع اشتراک این قوانین است. سعی کنید از همین قواعد مشترک استفاده کنید تا بعدا سردرگم نشوید.
#mongodb #nosql
رقصنده با کد
روی MongoDB اگر میخواهید ببینید که مقدار مورد نظرتون داخل آرایه ای که روی یک فیلد ذخیره شده ، وجود داره یا نه ، سراغ روشهای عجیب غریب نرید. از ویژگی های خود منگو استفاده کنید. برای مثال بالا بنویسید : db.<collection_name>.find( { tags: "red" } ) خروجیش میشه…
توی منگو برای دسترسی به ایندکس خاصی روی یک آرایه ، میتونید از دات نونتیشن (همون نقطه) روی یک فیلد به همراه ایندکس مد نظرتون استفاده کنید ، ولی ۲ تا نکته رو مد نظر داشته باشید :
۱- ایندکس ها از صفر شروع میشن.
۲- هر جا از دات نوتیشن استفاده کردید ، فیلد و ایندکس با هم دیگه باید داخل کوتیشن نوشته بشن. مثال :
db.<collection_name>.find({"tags.1":"red"})
یه نکته پیشرفته هم اگر بخوام بگم اینه اگر میخواید روی همه آیتمهای یک آرایه روی یک فیلد مشترک در همه داکیومنت های یک کالکشن ، کار خاصی رو انجام بدید ، میتونید از positional operator یا همون []$ استفاده کنید. مثال :
db.students.update(
{ },
{ $inc: { "grades.$[]": 10 } },
{ multi: true }
)
فیلد multi : true به خاطر اینه که داریم از update استفاده میکنیم
#mongodb #nosql
۱- ایندکس ها از صفر شروع میشن.
۲- هر جا از دات نوتیشن استفاده کردید ، فیلد و ایندکس با هم دیگه باید داخل کوتیشن نوشته بشن. مثال :
db.<collection_name>.find({"tags.1":"red"})
یه نکته پیشرفته هم اگر بخوام بگم اینه اگر میخواید روی همه آیتمهای یک آرایه روی یک فیلد مشترک در همه داکیومنت های یک کالکشن ، کار خاصی رو انجام بدید ، میتونید از positional operator یا همون []$ استفاده کنید. مثال :
db.students.update(
{ },
{ $inc: { "grades.$[]": 10 } },
{ multi: true }
)
فیلد multi : true به خاطر اینه که داریم از update استفاده میکنیم
#mongodb #nosql
نکات کار با فیلدهای آرایهای در Mongodb :
۱- فیلد آرایه ای شامل یک آیتم خاص:
db.inventory.find( { tags: "red" } )
۲- فیلد آرایه ای شامل چند آیتم خاص همراه با رعایت ترتیب : (فقط آرایه ای که دقیقا معادل باشد)
db.inventory.find( { tags: ["red", "blank"] } )
۳- فیلد آرایه ای شامل چند آیتم بدون رعایت ترتیب : (آرایه باید شامل این آیتم ها باشد ولی میتواند آیتمهای دیگری نیز داشته باشد)
db.inventory.find( { tags: { $all: ["red", "blank"] } } )
۴- فیلد آرایه ای که حداقل یکی از آیتمهای آن شرط را پاس کند :
db.inventory.find( { dim_cm: { $gt: 25 } } )
۵- فیلد آرایه ای که حداقل یکی از آیتمهای آن یکی از شروط را پاس کند :
db.inventory.find( { dim_cm: { $gt: 15, $lt: 20 } } )
۶- فیلد آرایه ای که حداقل یکی از آیتمهای آن همه شروط را پاس کند :
db.inventory.find( { dim_cm: { $elemMatch: { $gt: 22, $lt: 30 } } } )
۷- فیلد آرایه ای بر اساس طول آرایه :
db.inventory.find( { "tags": { $size: 3 } } )
۸- فیلد آرایه ای بر اساس ایندکس :
db.<collection_name>.find({"tags.1":"red"})
۱- فیلد آرایه ای شامل یک آیتم خاص:
db.inventory.find( { tags: "red" } )
۲- فیلد آرایه ای شامل چند آیتم خاص همراه با رعایت ترتیب : (فقط آرایه ای که دقیقا معادل باشد)
db.inventory.find( { tags: ["red", "blank"] } )
۳- فیلد آرایه ای شامل چند آیتم بدون رعایت ترتیب : (آرایه باید شامل این آیتم ها باشد ولی میتواند آیتمهای دیگری نیز داشته باشد)
db.inventory.find( { tags: { $all: ["red", "blank"] } } )
۴- فیلد آرایه ای که حداقل یکی از آیتمهای آن شرط را پاس کند :
db.inventory.find( { dim_cm: { $gt: 25 } } )
۵- فیلد آرایه ای که حداقل یکی از آیتمهای آن یکی از شروط را پاس کند :
db.inventory.find( { dim_cm: { $gt: 15, $lt: 20 } } )
۶- فیلد آرایه ای که حداقل یکی از آیتمهای آن همه شروط را پاس کند :
db.inventory.find( { dim_cm: { $elemMatch: { $gt: 22, $lt: 30 } } } )
۷- فیلد آرایه ای بر اساس طول آرایه :
db.inventory.find( { "tags": { $size: 3 } } )
۸- فیلد آرایه ای بر اساس ایندکس :
db.<collection_name>.find({"tags.1":"red"})
آخرین نسخه MongoDB روی سیستم های 32 بیتی نصب نمیشه. در واقع از ورژن ۳.۴ به بعد دیگه نصب نمیشه.
همچنین فقط روی ویندوز ۱۰ ، مک او اس ۱۰.۱۳ و ابونتو ۱۶.۰۴ به بعد نصب میشه. دنبال نصبش روی ورژنهای قبلی نباشید.
اگر مجبورید روی سیستم ضعیفی ازش استفاده کنید برید سراغ ورژنهای قبل از ۳.۴.
برای دوستان رد هتیمون هم ، درجریان باشید که منگو روی کرنلهای UEK کار نمیکنه و باید از کرنل RHCK استفاده کنید.
سعی کنید برای محیط آزمایشگاهیتون ، منگو رو روی لینوکس نصب کنید چون به احتمال قریب به یقین ، محیط productionتون روی لینوکس خواهد بود مگر اینکه واقعا بدونید بعدا از چی میخواید استفاده کنید.
#mongodb #nosql
همچنین فقط روی ویندوز ۱۰ ، مک او اس ۱۰.۱۳ و ابونتو ۱۶.۰۴ به بعد نصب میشه. دنبال نصبش روی ورژنهای قبلی نباشید.
اگر مجبورید روی سیستم ضعیفی ازش استفاده کنید برید سراغ ورژنهای قبل از ۳.۴.
برای دوستان رد هتیمون هم ، درجریان باشید که منگو روی کرنلهای UEK کار نمیکنه و باید از کرنل RHCK استفاده کنید.
سعی کنید برای محیط آزمایشگاهیتون ، منگو رو روی لینوکس نصب کنید چون به احتمال قریب به یقین ، محیط productionتون روی لینوکس خواهد بود مگر اینکه واقعا بدونید بعدا از چی میخواید استفاده کنید.
#mongodb #nosql
یه خواهش کلی از همه دوستانمون مخصوصا لینوکسی ها...
لطفا لطفا لطفا برای محیط production ، انجام hardening یادتون نره. میدونم احتمالا انجام هم ندید کسی متوجه نمیشه و شاید این کلمه رو هم خودتون تا حالا نشنیده بودید. معنیش این میشه طبق داکیومنتهای موجود مواردی از جمله security رو تقویت کنید. آیتم های خیلی زیادی هست و فقط انتخاب پسوورد قوی کافی نیست.
این ربطی به دیتابیس و زبان برنامه نویسی و ... نداره. هر چیزی که به شبکه وصل میشه ( یا به طور کلی به برق وصل میشه ) باید روش hardening انجام بشه. چه برسه که این چیز محصولی باشه که ازش قراره کسب درآمد بشه.
لطفا لطفا لطفا برای محیط production ، انجام hardening یادتون نره. میدونم احتمالا انجام هم ندید کسی متوجه نمیشه و شاید این کلمه رو هم خودتون تا حالا نشنیده بودید. معنیش این میشه طبق داکیومنتهای موجود مواردی از جمله security رو تقویت کنید. آیتم های خیلی زیادی هست و فقط انتخاب پسوورد قوی کافی نیست.
این ربطی به دیتابیس و زبان برنامه نویسی و ... نداره. هر چیزی که به شبکه وصل میشه ( یا به طور کلی به برق وصل میشه ) باید روش hardening انجام بشه. چه برسه که این چیز محصولی باشه که ازش قراره کسب درآمد بشه.