پایتون و MongoDB: ساخت پایگاه داده، کالکشن و دستور INSERT

11 آبان 1398
پایتون و MongoDB: ساخت پایگاه داده، کالکشن و دستور INSERT

پایتون و MongoDB

همانطور که گفتیم پایتون می تواند با برنامه های پایگاه داده کار کند اما ممکن است نخواهید از برنامه هایی مانند MySQL استفاده کنید، بلکه برنامه هایی مانند MongoDB مد نظر شما باشند. MongoDB یکی از مشهورترین برنامه های پایگاه داده ی NoSQL است. در واقع پایگاه های داده ی SQL همگی دارای جدول هایی هستند و این جدول ها با یکدیگر روابط مشخص دارند اما پایگاه های داده ی NoSQL مدل های دیگری به غیر از مدل جدولی SQL برای دریافت و ذخیره ی داده ها دارند. میتوان از مشهورترین پایگاه های داده ی NoSQL به موارد زیر اشاره کرد:

  • MongoDB
  • Redis
  • DynamoDB
  • Azure Cosmos DB
  • Couchbase
  • HBase

پایگاه داده ی MongoDB داده ها را در قالب هایی شبیه قالب JSON ذخیره می کند، به همین دلیل بسیار منعطف و مقیاس پذیر است. اگر می خواهید کدهای دوره را به صورت عملی امتحان کنید نیاز به نصب MongoDB خواهید داشت؛ برای نصب آن به این لینک مراجعه کنید: https://www.mongodb.com

ماژول PyMongo

زبان پایتون برای کار با پایگاه داده ی MogoDB به یک درایور نیاز دارد و ما تصمیم گرفتیم در این دوره از درایور PyMongo استفاده کنیم. بهتر است برای جلوگیری از ایجاد مشکلات مختلف از PIP برای نصب PyMongo استفاده کنید:

C:\Users\Your Name\AppData\Local\Programs\Python\Python36-32\Scripts>python -m pip install pymongo

پس از اجرای دستور بالا برای نصب PyMongo باید تست کنیم تا مطمئن شویم PyMongo به درستی نصب شده است. برای انجام این کار یک فایل تست پایتون (مثلا به نام demo_mongodb_test.py) ایجاد کنید و دستور زیر را در آن قرار دهید:

import pymongo

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

ساخت پایگاه داده ی MongoDB

برای ساخت یک پایگاه داده در MongoDB باید ابتدا شیء MongoClient را ایجاد کنید، سپس URL اتصال را به همراه ip و نام پایگاه داده به آن پاس می دهید. اگر چنین پایگاه داده ای از قبل وجود نداشته باشد MongoDB آن را ساخته و یک اتصال با آن برقرار می کند. برای مثال در کد زیر یک پایگاه داده به نام mydatabase ساخته ایم:

import pymongo

myclient = pymongo.MongoClient('mongodb://localhost:27017/')

mydb = myclient['mydatabase']

نکته: لطفا توجه داشته باشید که MongoDB صبر می کند تا document در collection شما دریافت شود و سپس آن پایگاه داده را می سازد. به عبارت دیگر در MongoDB تا زمانی که محتوایی دریافت نشود، هیچ collection یا پایگاه داده ای ساخته نخواهد شد و collection خالی هیچ معنایی ندارد. در MongoDB مفهوم collection معادل جدول (table) و document معادل ردیف (record) می باشد.

اگر می خواهید لیست پایگاه های داده ی موجود در سیستم را مشاهده کنید، می توانید از متد list_database_names استفاده کنید:

import pymongo

myclient = pymongo.MongoClient('mongodb://localhost:27017/')

print(myclient.list_database_names())

خروجی:

['admin', 'local', 'mydatabase']

البته اگر به دنبال پایگاه داده ی خاصی می گردید، می توانید نام آن را نیز جستجو کنید:

import pymongo

myclient = pymongo.MongoClient('mongodb://localhost:27017/')

dblist = myclient.list_database_names()
if "mydatabase" in dblist:
  print("The database exists.")

خروجی:

The database exists.

هشدار: همانطور که در نکته ی بالا گفتیم، در MogoDB تا زمانی که محتوایی (منظور هر نوع داده ای برای قرار گرفتن در پایگاه داده است) دریافت نشود آن پایگاه داده ساخته نخواهد شد. بنابراین اگر دفعه ی اولی است که پایگاه داده می سازید و هنوز داده ای در آن ندارید (حتی اگر شیء MongoClient را ایجاد کرده باشید) پایگاه داده ی شما در سیستم ثبت نخواهد شد و جستجوی آن با دستورات بالا نتیجه ای به همراه نخواهد داشت.

ساخت Collection

همانطور که گفتیم کالکشن (Collection) معادل جدول یا همان table در پایگاه های داده ی SQL است. برای ساخت کالکشن ها باید از شیء پایگاه داده استفاده کرده و نام کالکشن را انتخاب کنید. در صورتی که collection مورد نظر شما از قبل وجود نداشته باشد توسط MongoDB ساخته خواهد شد. فرض کنید بخواهیم collection ای به نام customers بسازیم، در این صورت:

import pymongo

myclient = pymongo.MongoClient('mongodb://localhost:27017/')

mydb = myclient['mydatabase']

mycol = mydb["customers"]

با اجرای این دستور کار ما تمام می شود اما یادتان باشد که هنوز این collection ساخته نشده است. MongoDB منتظر می ماند تا شما document ای را وارد این کالکشن کنید.

همانطور که می توانستیم وجود پایگاه های داده ی مختلف را چک کنیم، می توانیم وجود کالکشن های مختلف را نیز بررسی کنیم. به طور مثال دستور list_collection_names تمام کالکشن های ما را برایمان لیست می کند:

import pymongo

myclient = pymongo.MongoClient('mongodb://localhost:27017/')

mydb = myclient['mydatabase']

mycol = mydb["customers"]

print(mydb.list_collection_names())

خروجی:

['customers']

و یا اینکه می توانید به جای لیست کردن تمامی کالکشن ها، به دنبال کالکشن خاصی بگردید:

import pymongo

myclient = pymongo.MongoClient('mongodb://localhost:27017/')

mydb = myclient['mydatabase']

collist = mydb.list_collection_names()
if "customers" in collist:
  print("The collection exists.")

خروجی:

The collection exists.

توجه داشته باشید؛ تا زمانی که داده ای (document) در این کالکشن ها ثبت نشود، کالکشن مورد نظر ایجاد نخواهد شد. بنابراین در لیست کالکشن ها (مثال های بالا) نیز وجود نخواهد داشت.

ثبت داده ی جدید در کالکشن

همانطور که گفتیم document ها معادل همان ردیف ها (record) در پایگاه های داده ی SQL هستند. برای ثبت داده های جدید یا Document درون کالکشن ها باید از متد ()insert_one استفاده کنید؛ آرگومان اول این تابع یک dictionary است که name و value های فیلدهای مورد نظر را در خود دارد. در کد زیر می خواهیم یک document را وارد کالکشن customers کنیم:

import pymongo

myclient = pymongo.MongoClient('mongodb://localhost:27017/')
mydb = myclient['mydatabase']
mycol = mydb["customers"]

mydict = { "name": "John", "address": "Highway 37" }

x = mycol.insert_one(mydict)

print(x)

خروجی:

<pymongo.results.InsertOneResult object at 0x03D62918>

زمانی که متد ()insert_one اجرا می شود یک شیء به نام InsertOneResult برمی گرداند که حاوی خصوصیتی به نام inserted_id است. این خصوصیت id document ثبت شده را دارد:

import pymongo

myclient = pymongo.MongoClient('mongodb://localhost:27017/')
mydb = myclient['mydatabase']
mycol = mydb["customers"]

mydict = { "name": "Peter", "address": "Lowstreet 27" }

x = mycol.insert_one(mydict)

print(x.inserted_id)

خروجی:

5b1910482ddb101b7042fcd7

اگر برای فیلد id_ مقداری در نظر نگیرید، MongoDB به صورت خودکار یک مقدار یکتا و غیرتکراری را برای id در نظر می گیرد. در مثال بالا هیچ مقداری به id_ ندادیم بنابراین id ما توسط MongoDB تولید شده است.

ثبت چندین داده به صورت همزمان

اگر بخواهید چندین داده (document) را به صورت همزمان وارد کالکشن خود کنید، استفاده از متد ()insert_one کار سختی خواهد بود. روش بهتر استفاده از ()insert_many است. آرگومان اول این متد یک list است که خود حاوی dictionary هایی بوده که حاوی تمام موارد مورد نظر شما برای ثبت در کالکشن می باشد. به مثال زیر دقت کنید:

import pymongo

myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["mydatabase"]
mycol = mydb["customers"]

mylist = [
  { "name": "Amy", "address": "Apple st 652"},
  { "name": "Hannah", "address": "Mountain 21"},
  { "name": "Michael", "address": "Valley 345"},
  { "name": "Sandy", "address": "Ocean blvd 2"},
  { "name": "Betty", "address": "Green Grass 1"},
  { "name": "Richard", "address": "Sky st 331"},
  { "name": "Susan", "address": "One way 98"},
  { "name": "Vicky", "address": "Yellow Garden 2"},
  { "name": "Ben", "address": "Park Lane 38"},
  { "name": "William", "address": "Central st 954"},
  { "name": "Chuck", "address": "Main Road 989"},
  { "name": "Viola", "address": "Sideway 1633"}
]

x = mycol.insert_many(mylist)

#print list of the _id values of the inserted documents:

print(x.inserted_ids)

خروجی:

[ObjectId('5b19112f2ddb101964065487'), ObjectId('5b19112f2ddb101964065488'), ObjectId('5b19112f2ddb101964065489'), ObjectId('5b19112f2ddb10196406548a'), ObjectId('5b19112f2ddb10196406548b'), ObjectId('5b19112f2ddb10196406548c'), ObjectId('5b19112f2ddb10196406548d'), ObjectId('5b19112f2ddb10196406548e'), ObjectId('5b19112f2ddb10196406548f'), ObjectId('5b19112f2ddb101964065490'), ObjectId('5b19112f2ddb101964065491'), ObjectId('5b19112f2ddb101964065492')]

این خروجی ها id داده هایی است که در کالکشن خودمان ذخیره کرده ایم. در واقع متد ()insert_many پس از اجرا شیء ای به نام InsertManyResult برمی گرداند که حاوی id های ثبت شده در کالکشن است.

نکته: اگر دوست ندارید که MongoDB به صورت خودکار برایتان id ها را اضافه کند باید خودتان به صورت دستی id ها را بنویسید. یادتان باشد که id ها باید یکتا و غیرتکراری باشند و هیچ دو document ای نمی توانند یک id یکسان داشته باشند.

import pymongo

myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["mydatabase"]
mycol = mydb["customers"]

mylist = [
  { "_id": 1, "name": "John", "address": "Highway 37"},
  { "_id": 2, "name": "Peter", "address": "Lowstreet 27"},
  { "_id": 3, "name": "Amy", "address": "Apple st 652"},
  { "_id": 4, "name": "Hannah", "address": "Mountain 21"},
  { "_id": 5, "name": "Michael", "address": "Valley 345"},
  { "_id": 6, "name": "Sandy", "address": "Ocean blvd 2"},
  { "_id": 7, "name": "Betty", "address": "Green Grass 1"},
  { "_id": 8, "name": "Richard", "address": "Sky st 331"},
  { "_id": 9, "name": "Susan", "address": "One way 98"},
  { "_id": 10, "name": "Vicky", "address": "Yellow Garden 2"},
  { "_id": 11, "name": "Ben", "address": "Park Lane 38"},
  { "_id": 12, "name": "William", "address": "Central st 954"},
  { "_id": 13, "name": "Chuck", "address": "Main Road 989"},
  { "_id": 14, "name": "Viola", "address": "Sideway 1633"}
]

x = mycol.insert_many(mylist)

#print a list of the _id values of the inserted documents:
print(x.inserted_ids)

خروجی:

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]

همانطور که می بینید کار با MongoDB آنقدر ها هم تفاوتی با MySQL ندارد و به دلیل وجود اشتراکات بسیار زیاد یادگیری آن در چند جلسه قابل انجام است. در قسمت بعد در رابطه با متدهایی مانند find و اجرای کوئری ها صحبت خواهیم کرد.

تمام فصل‌های سری ترتیبی که روکسو برای مطالعه‌ی دروس سری از مقدماتی تا پیشرفته با پایتون توصیه می‌کند:
نویسنده شوید

دیدگاه‌های شما (1 دیدگاه)

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

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

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