از طریق منوی جستجو مطلب مورد نظر خود در وبلاگ را به سرعت پیدا کنید
ادغام MongoDB با پایتون با استفاده از PyMongo
سرفصلهای مطلب
معرفی
در این پست به بررسی آن خواهیم پرداخت MongoDB به عنوان یک ذخیره سازی داده از دیدگاه پایتون. برای این منظور، ما یک اسکریپت ساده می نویسیم تا آنچه را که می توانیم به دست آوریم و هر مزیتی که می توانیم از آن به دست آوریم، به نمایش بگذاریم.
برنامه های کاربردی وب، مانند بسیاری از برنامه های کاربردی نرم افزار دیگر، توسط داده ها تغذیه می شوند. سازماندهی و ذخیره سازی این داده ها مهم است زیرا روش تعامل ما با برنامه های مختلف در اختیار را دیکته می کند. نوع داده ای که به کار گرفته می شود نیز می تواند تأثیرگذار باشد روی چگونه این کار را انجام می دهیم process.
پایگاه های داده به ما امکان می دهند این داده ها را سازماندهی و ذخیره کنیم، در حالی که روش ذخیره، دسترسی و ایمن سازی اطلاعات را نیز کنترل می کنیم.
پایگاه های داده NoSQL
دو نوع اصلی پایگاه داده وجود دارد – رابطه ای و پایگاه های داده غیر رابطه ای.
پایگاه داده های رابطه ای به ما اجازه می دهد تا داده ها را در رابطه با قطعه دیگری از داده در پایگاه داده ذخیره، دسترسی و دستکاری کنیم. داده ها در جداول سازماندهی شده با ردیف ها و ستون ها با روابطی که اطلاعات را بین جداول به هم پیوند می دهند، ذخیره می شوند. برای کار با این دیتابیس ها از زبان پرس و جو ساختاریافته (SQL) و نمونه هایی شامل MySQL و PostgreSQL.
پایگاه داده های غیر رابطه ای مانند پایگاه داده های رابطه ای، داده ها را به صورت نه رابطه ای یا جدولی ذخیره کنید. به آنها نیز اشاره می شود NoSQL از آنجایی که ما از SQL برای تعامل با آنها استفاده نمی کنیم.
علاوه بر این، پایگاه های داده NoSQL را می توان به دو دسته تقسیم کرد فروشگاه های Key-Value، فروشگاه های نمودار، فروشگاه های ستون، و فروشگاه های اسناد، که MongoDB تحت آن قرار می گیرد.
MongoDB و زمان استفاده از آن
MongoDB یک است فروشگاه اسناد و پایگاه داده غیر رابطه ای. به ما امکان می دهد داده ها را در آن ذخیره کنیم مجموعه ها که تشکیل شده اند اسناد.
در MongoDB، یک سند به سادگی یک فرمت سریال سازی باینری مانند JSON است که به آن a BSON، یا Binary-JSON، و حداکثر اندازه آن 16 مگابایت است. این محدودیت اندازه برای اطمینان از استفاده کارآمد از حافظه و پهنای باند در طول انتقال وجود دارد.
MongoDB همچنین ارائه می دهد مشخصات GridFS در صورت نیاز به ذخیره فایل های بزرگتر از حد تعیین شده.
اسناد درست مانند داده های JSON معمولی از جفت های فیلد-مقدار تشکیل شده اند. با این حال، این فرمت BSON همچنین می تواند حاوی انواع داده های بیشتری باشد، مانند Date
انواع و Binary Data
انواع BSON به گونهای طراحی شده است که هنگام رمزگذاری و رمزگشایی دادهها به و از BSON سبک، به راحتی قابل عبور و کارآمد باشد.
MongoDB به عنوان یک داده NoSQL به ما اجازه می دهد از مزایای استفاده از پایگاه داده غیررابطه ای نسبت به پایگاه داده رابطه ای بهره مند شویم. یک مزیت این است که مقیاس پذیری بالایی را با مقیاس افقی کارآمد از طریق تقسیم یا پارتیشن بندی داده ها و قرار دادن آنها ارائه می دهد. روی ماشین های متعدد
MongoDB همچنین به ما اجازه می دهد تا حجم زیادی از داده های ساختاریافته، نیمه ساختاریافته و بدون ساختار را بدون نیاز به حفظ روابط بین آن ها ذخیره کنیم. به دلیل منبع باز بودن، هزینه پیادهسازی MongoDB فقط برای تعمیر و نگهداری و تخصص پایین نگه داشته میشود.
مانند هر راه حل دیگری، استفاده از MongoDB دارای معایبی است. اولین مورد این است که روابط بین داده های ذخیره شده را حفظ نمی کند. به همین دلیل اجرای آن سخت است معاملات اسید که ثبات را تضمین می کند.
هنگام تلاش برای پشتیبانی از تراکنش های ACID، پیچیدگی افزایش می یابد. MongoDB، مانند سایر فروشگاههای داده NoSQL، به اندازه پایگاههای داده رابطهای بالغ نیست و این میتواند یافتن متخصصان را دشوار کند.
ماهیت غیر رابطه ای MongoDB آن را برای ذخیره سازی داده ها در موقعیت های خاص نسبت به همتایان رابطه ای خود ایده آل می کند. برای مثال، سناریویی که در آن MongoDB مناسبتر از پایگاه داده رابطهای است، زمانی است که قالب داده انعطافپذیر است و هیچ رابطهای ندارد.
با دادههای انعطافپذیر/غیر رابطهای، ما نیازی به حفظ ویژگیهای ACID در هنگام ذخیره دادهها در مقابل پایگاههای داده رابطهای نداریم. MongoDB همچنین به ما اجازه می دهد تا داده ها را به راحتی در گره های جدید مقیاس بندی کنیم.
با این حال، با تمام مزایای آن، MongoDB زمانی ایده آل نیست که داده های ما ماهیت رابطه ای داشته باشند. به عنوان مثال، اگر سوابق مشتریان و سفارشات آنها را ذخیره می کنیم.
در این شرایط، ما به یک پایگاه داده رابطه ای نیاز خواهیم داشت تا روابط بین داده هایمان را که مهم هستند حفظ کنیم. همچنین استفاده از MongoDB در صورت نیاز به رعایت خواص ACID مناسب نیست.
تعامل با MongoDB از طریق Mongo Shell
برای کار با MongoDB، باید آن را نصب کنیم سرور MongoDB، که می توانیم از آن دانلود کنیم رسمی homepage. برای این نمایش، ما از سرور رایگان انجمن استفاده خواهیم کرد.
سرور MongoDB با یک مونگو شل که می توانیم برای تعامل با سرور از طریق استفاده کنیم terminal.
برای فعال کردن پوسته، فقط تایپ کنید mongo
در شما terminal. اطلاعاتی در مورد راه اندازی سرور MongoDB، از جمله نسخه MongoDB و Mongo Shell، در کنار URL سرور دریافت خواهید کرد.
به عنوان مثال، سرور ما در حال اجرا است روی:
mongodb://127.0.0.1:27017
در MongoDB از یک پایگاه داده برای نگهداری مجموعه هایی که حاوی اسناد هستند استفاده می شود. از طریق پوسته Mongo، میتوانیم یک پایگاه داده جدید ایجاد کنیم یا با استفاده از آن به پایگاه داده موجود تغییر دهیم use
دستور:
> use SeriesDB
هر عملیاتی که بعد از این اجرا می کنیم در ما تحت تأثیر قرار می گیرد SeriesDB
پایگاه داده در پایگاه داده، مجموعه هایی را ذخیره می کنیم که شبیه جداول در پایگاه داده های رابطه ای هستند.
به عنوان مثال، برای اهداف این آموزش، اجازه دهید چند سری به پایگاه داده اضافه کنیم:
> db.series.insertMany((
... { name: "Game of Thrones", year: 2012},
... { name: "House of Cards", year: 2013 },
... { name: "Suits", year: 2011}
... ))
به ما خوش آمد می گوید:
{
"acknowledged" : true,
"insertedIds" : (
ObjectId("5e300724c013a3b1a742c3b9"),
ObjectId("5e300724c013a3b1a742c3ba"),
ObjectId("5e300724c013a3b1a742c3bb")
)
}
برای واکشی همه اسناد ذخیره شده در ما series
مجموعه، استفاده می کنیم db.inventory.find({})
، که معادل SQL آن است SELECT * FROM series
. ارسال یک پرس و جو خالی (یعنی {}
) تمام مدارک را برمی گرداند:
> db.series.find({})
{ "_id" : ObjectId("5e3006258c33209a674d1d1e"), "name" : "The Blacklist", "year" : 2013 }
{ "_id" : ObjectId("5e300724c013a3b1a742c3b9"), "name" : "Game of Thrones", "year" : 2012 }
{ "_id" : ObjectId("5e300724c013a3b1a742c3ba"), "name" : "House of Cards", "year" : 2013 }
{ "_id" : ObjectId("5e300724c013a3b1a742c3bb"), "name" : "Suits", "year" : 2011 }
ما همچنین میتوانیم با استفاده از شرط برابری، دادهها را پرس و جو کنیم، بهعنوان مثال، برای بازگرداندن همه سریالهای تلویزیونی که در سال 2013 پخش شد:
> db.series.find({ year: 2013 })
{ "_id" : ObjectId("5e3006258c33209a674d1d1e"), "name" : "The Blacklist", "year" : 2013 }
{ "_id" : ObjectId("5e300724c013a3b1a742c3ba"), "name" : "House of Cards", "year" : 2013 }
معادل SQL خواهد بود SELECT * FROM series WHERE year=2013
.
MongoDB همچنین به ما اجازه می دهد تا اسناد فردی را با استفاده از آن به روز کنیم db.collection.UpdateOne()
، یا به روز رسانی دسته ای را با استفاده از db.collection.UpdateMany()
. به عنوان مثال، برای به روز رسانی سال انتشار برای Suits
:
> db.series.updateOne(
{ name: "Suits" },
{
$set: { year: 2010 }
}
)
{ "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 }
در نهایت، برای حذف اسناد، Mongo Shell این را ارائه می دهد db.collection.deleteOne()
و db.collection.deleteMany()
کارکرد.
به عنوان مثال، برای حذف تمام سریال هایی که برای اولین بار در آن پخش شد 2012
، می دویدیم:
> db.series.deleteMany({ year: 2012 })
{ "acknowledged" : true, "deletedCount" : 2 }
اطلاعات بیشتر روی عملیات CRUD روی MongoDB را می توان یافت در مرجع آنلاین از جمله مثال های بیشتر، انجام عملیات با شرایط، اتمی بودن، و نگاشت مفاهیم SQL به مفاهیم و اصطلاحات MongoDB.
ادغام پایتون با MongoDB
MongoDB درایورها و ابزارهایی را برای تعامل با یک دیتا استور MongoDB با استفاده از زبان های برنامه نویسی مختلف از جمله پایتون، جاوا اسکریپت، جاوا، Go و C# و غیره ارائه می دهد.
PyMongo درایور رسمی MongoDB برای پایتون است و ما از آن برای ایجاد یک اسکریپت ساده استفاده خواهیم کرد که از آن برای دستکاری داده های ذخیره شده در خود استفاده می کنیم. SeriesDB
پایگاه داده
با پایتون 3.6+ و Virtualenv نصب شده در ماشین های ما، اجازه دهید یک محیط مجازی برای برنامه خود ایجاد کنیم و PyMongo را از طریق آن نصب کنیم pip:
$ virtualenv --python=python3 env --no-site-packages
$ source env/bin/activate
$ pip install pymongo
استفاده کردن PyMongo
، می خواهیم یک اسکریپت ساده بنویسیم که بتوانیم آن را برای انجام عملیات های مختلف اجرا کنیم روی پایگاه داده MongoDB ما.
اتصال به MongoDB
اول ما import pymongo
در ما mongo_db_script.py
و یک کلاینت متصل به نمونه در حال اجرا محلی ما از MongoDB ایجاد کنید:
import pymongo
client = MongoClient('localhost', 27017)
db = client('SeriesDB')
series_collection = db('series')
تا کنون، ما یک کلاینت ایجاد کردهایم که به سرور MongoDB ما متصل میشود و از آن برای واکشی پایگاه داده «SeriesDB» ما استفاده میکند. سپس مجموعه “سری” خود را واکشی می کنیم و آن را در یک شی ذخیره می کنیم.
ایجاد اسناد
برای راحتتر کردن اسکریپتمان، توابعی را مینویسیم که در اطراف قرار میگیرند PyMongo
تا ما را قادر سازد به راحتی داده ها را دستکاری کنیم. ما از دیکشنری های پایتون برای نمایش اسناد استفاده می کنیم و این دیکشنری ها را به توابع خود منتقل می کنیم. ابتدا، اجازه دهید یک تابع برای درج داده ها در مجموعه “سری” خود ایجاد کنیم:
def insert_document(collection, data):
""" Function to insert a document into a collection and
return the document's id.
"""
return collection.insert_one(data).inserted_id
این تابع یک مجموعه و یک فرهنگ لغت از داده ها را دریافت می کند و داده ها را در مجموعه ارائه شده درج می کند. سپس تابع یک شناسه را برمیگرداند که میتوانیم از آن برای پرسوجویی دقیق شی منفرد از پایگاه داده استفاده کنیم.
همچنین باید توجه داشته باشیم که MongoDB یک مورد اضافی اضافه می کند _id
کلید اسناد ما، زمانی که آنها ارائه نمی شوند، هنگام ایجاد داده ها.
حالا بیایید با استفاده از تابع خود یک نمایش اضافه کنیم:
new_show = {
"name": "FRIENDS",
"year": 1994
}
print(insert_document(series_collection, new_show))
خروجی این است:
5e4465cfdcbbdc68a6df233f
وقتی اسکریپت خود را اجرا می کنیم، _id
نمایش جدید ما چاپ شده است روی را terminal و ما می توانیم از این شناسه برای واکشی نمایش بعدا استفاده کنیم روی.
ما می توانیم ارائه دهیم _id
مقدار به جای تخصیص خودکار آن، که ما در فرهنگ لغت ارائه می دهیم:
new_show = {
"_id": "1",
"name": "FRIENDS",
"year": 1994
}
و اگر بخواهیم سندی را با یک موجود ذخیره کنیم _id
، با خطای مشابه زیر مواجه می شویم:
DuplicateKeyError: E11000 duplicate key error index: SeriesDB.series.$id dup key: { : 1}
بازیابی اسناد
برای بازیابی اسناد از پایگاه داده استفاده خواهیم کرد find_document()
، که مجموعه ما را برای اسناد منفرد یا چندگانه جستجو می کند. تابع ما یک فرهنگ لغت دریافت می کند که حاوی عناصری است که می خواهیم با آن فیلتر کنیم و یک آرگومان اختیاری برای تعیین اینکه آیا یک سند یا چندین سند را می خواهیم:
def find_document(collection, elements, multiple=False):
""" Function to retrieve single or multiple documents from a provided
Collection using a dictionary containing a document's elements.
"""
if multiple:
results = collection.find(elements)
return (r for r in results)
else:
return collection.find_one(elements)
و اکنون، بیایید از این تابع برای یافتن برخی از اسناد استفاده کنیم:
result = find_document(series_collection, {'name': 'FRIENDS'})
print(result)
هنگام اجرای تابع خود، ما آن را ارائه نکردیم multiple
پارامتر و نتیجه یک سند واحد است:
{'_id': ObjectId('5e3031440597a8b07d2f4111'), 'name': 'FRIENDS', 'year': 1994}
وقتی که multiple
پارامتر ارائه شده است، نتیجه لیستی از تمام اسناد مجموعه ما است که دارای a name
صفت تنظیم شده است FRIENDS
.
به روز رسانی اسناد
عملکرد بعدی ما، update_document()
، برای به روز رسانی یک سند خاص استفاده می شود. ما استفاده خواهیم کرد _id
از سند و مجموعه ای که در هنگام پیدا کردن آن به آن تعلق دارد:
def update_document(collection, query_elements, new_values):
""" Function to update a single document in a collection.
"""
collection.update_one(query_elements, {'$set': new_values})
حالا بیایید یک سند وارد کنیم:
new_show = {
"name": "FRIENDS",
"year": 1995
}
id_ = insert_document(series_collection, new_show)
با انجام این کار، اجازه دهید سند را به روز کنیم، که با استفاده از آن مشخص می کنیم _id
از افزودن آن بازگشت:
update_document(series_collection, {'_id': id_}, {'name': 'F.R.I.E.N.D.S'})
و در نهایت، بیایید آن را واکشی کنیم تا بررسی کنیم که مقدار جدید در جای خود قرار گرفته است و print نتیجه:
result = find_document(series_collection, {'_id': id_})
print(result)
وقتی اسکریپت خود را اجرا می کنیم، می بینیم که سند ما به روز شده است:
{'_id': ObjectId('5e30378e96729abc101e3997'), 'name': 'F.R.I.E.N.D.S', 'year': 1995}
حذف اسناد
و در نهایت، اجازه دهید یک تابع برای حذف اسناد بنویسیم:
def delete_document(collection, query):
""" Function to delete a single document from a collection.
"""
collection.delete_one(query)
از آنجایی که ما از delete_one
روش، در هر تماس فقط یک سند را می توان حذف کرد، حتی اگر درخواست با چندین سند مطابقت داشته باشد.
حالا بیایید از تابع برای حذف یک ورودی استفاده کنیم:
delete_document(series_collection, {'_id': id_})
اگر سعی کنیم همان سند را بازیابی کنیم:
result = find_document(series_collection, {'_id': id_})
print(result)
ما با نتیجه مورد انتظار استقبال می کنیم:
None
مراحل بعدی
ما تعدادی از آنها را برجسته و استفاده کرده ایم PyMongo
روشهایی برای تعامل با سرور MongoDB ما از طریق اسکریپت پایتون. با این حال، ما از تمام روش های موجود از طریق ماژول استفاده نکرده ایم.
تمام روش های موجود را می توان در اسناد رسمی PyMongo و بر اساس زیر ماژول ها طبقه بندی می شوند.
ما یک اسکریپت ساده نوشتهایم که عملکرد اولیه CRUD را انجام میدهد روی یک پایگاه داده MongoDB در حالی که ما می توانستیم import توابع موجود در یک پایگاه کد پیچیدهتر یا برای مثال در یک برنامه Flask/Django، این فریم ورکها دارای کتابخانههایی برای دستیابی به نتایج مشابه هستند. این کتابخانهها کار را آسانتر، راحتتر میکنند و به ما کمک میکنند امنتر به MongoDB متصل شویم.
به عنوان مثال، با جنگو می توانیم از کتابخانه هایی مانند موتور جنگو MongoDB و جانگو، در حالی که فلاسک دارد Flask-PyMongo که به پر کردن شکاف بین Flask و PyMongo برای تسهیل اتصال یکپارچه به پایگاه داده MongoDB کمک می کند.
نتیجه
MongoDB یک ذخیرهسازی اسناد است و در دسته پایگاههای داده غیررابطهای (NoSQL) قرار میگیرد. در مقایسه با پایگاه داده های رابطه ای دارای مزایای خاصی و همچنین معایبی است.
در حالی که برای همه موقعیتها مناسب نیست، ما همچنان میتوانیم از MongoDB برای ذخیره دادهها و دستکاری دادههای برنامههای پایتون خود با استفاده از استفاده کنیم. PyMongo
در میان کتابخانههای دیگر – به ما اجازه میدهد تا از قدرت MongoDB در موقعیتهایی که به بهترین وجه مناسب است استفاده کنیم.
بنابراین، این به ما بستگی دارد که قبل از تصمیم گیری برای استفاده از MongoDB برای ذخیره داده ها، الزامات خود را به دقت بررسی کنیم.
اسکریپتی که در این پست نوشته ایم را می توانید پیدا کنید روی GitHub.
(برچسبها به ترجمه)# python
منتشر شده در 1403-01-18 03:23:03