پایتون و MongoDB: متد sort و delete

25 آبان 1398
پایتون و MongoDB: متد sort و delete

متد ()sort

متد ()sort برای برای مرتب سازی نتایج برگشتی از پایگاه داده استفاده می شود و می تواند نتایج شما را به صورت صعودی یا نزولی مرتب کند (حالت پیش فرض این مرتب سازی صعودی است). این متد دو پارامتر می گیرد که به ترتیب fieldname (نام فیلد) و direction (به معنی «جهت» - همان نزولی یا صعودی بودن) نام دارند. به مثال زیر توجه کنید:

import pymongo

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

mydoc = mycol.find().sort("name")

for x in mydoc:
  print(x)

همانطور که در این کد مشاهده می کنید، پارامتر اول متد sort (یعنی fieldname) را به آن داده ایم: name اما پارامتر دوم چطور؟ مانند بسیاری از متدها در زبان های متخلف برنامه نویسی، پارامتر دوم متد sort الزامی نیست بنابراین با تعیین نکردن آن، مقدار پیش فرض را برایش در نظر گرفته ایم که همان مرتب سازی صعودی است. به خروجی زیر نگاه بیندازید:

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

همانطور که می بینید نام افراد به صورت صعودی (از A تا Z) مرتب شده است اما اگر بخواهیم به صورت نزولی مرتب شوند چطور؟ در واقع پارامتر دوم تابع sort توسط خود کلمات صعودی و نزولی (ascending و descending) تعیین نمی شوند بلکه با دو عدد 1 و 1- مشخص می شوند.  به طور مثال اگر همین مثال بالا را به صورت نزولی مرتب کنیم، می توان گفت:

import pymongo

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

mydoc = mycol.find().sort("name", -1)

for x in mydoc:
  print(x)

خروجی:

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

متدهای delete_one و delete_many

متد ()delete_one برای حذف document ها مورد استفاده قرار می گیرد، البته فقط یک مورد را حذف می کند. اولین پارامتر این متد، یک شیء کوئری است که مشخص می کند کدام Document حذف شود اما اگر کوئری شما طوری نوشته شده باشد که بیشتر از 1 مورد را شامل شود، تنها مورد اول حذف خواهد شد. به طور مثال در کد زیر می خواهیم ردیفی را حذف کنیم که آدرس آن برابر با Mountain 21 باشد:

import pymongo

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

myquery = { "address": "Mountain 21" }

mycol.delete_one(myquery)


#print the customers collection after the deletion:
for x in mycol.find():
  print(x)

در مثال بالا شیء کوئری را جداگانه تعریف کرده و سپس آن را به متد delete_one داده ایم. در آخر نیز تمام مشتریان را چاپ کرده ایم تا بتوانیم مورد حذف شده را تشخیص دهیم. خروجی ما بدین شکل خواهد بود:

{'_id': 1, 'name': 'John', 'address': 'Highway37'}
{'_id': 2, 'name': 'Peter', 'address': 'Lowstreet 27'}
{'_id': 3, 'name': 'Amy', 'address': 'Apple st 652'}
{'_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'}

اگر به این خروجی نگاه کنید متوجه خواهید شد که ردیف چهارم حذف شده است (id شماره ی 4 وجود ندارد) بنابراین مطمئن می شویم که ردیف موردنظر ما با موفقیت از بین رفته است.

در طرف دیگر معادله متد به نام ()delete_many را داریم که دقیقا مانند delete_one عمل می کند اما یک تفاوت اصلی دارد: اگر شیء کوئری ما شامل چندین ردیف بشود، متد ()delete_many تمام آن ردیف ها را حذف خواهد کرد. به طور مثال می خواهیم در کد زیر تمام ردیف هایی را حذف کنیم که آدرس آن ها با حرف S شروع می شود:

import pymongo

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

myquery = { "address": {"$regex": "^S"} }

x = mycol.delete_many(myquery)

print(x.deleted_count, "documents deleted")

در مورد regex ها قبلا صحبت کرده بودیم بنابراین آن را تکرار نمی کنم. همچنین در خط آخر این کد با استفاده از deleted_count توانسته ایم تعداد ردیف های حذف شده را روی صفحه نمایش دهیم. خروجی:

2 documents deleted.

نکته: اگر می خواهید تمام ردیف ها (document) در یک جدول (collection) حذف شوند، باید شیء کوئری (پارامتر اول delete_many) را خالی قرار دهید تا کوئری شامل تمام موارد بشود.

به طور مثال در کد زیر تمام ردیف های جدول customers را حذف کرده ایم:

import pymongo

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

x = mycol.delete_many({})

print(x.deleted_count, "documents deleted")

خروجی:

11 documents deleted.

همانطور که مشخص است 11 ردیف باقی مانده نیز پاک شده اند.

البته در صورتی که دوست دارید تمام جدول (همان collection) یکجا حذف شود، از متد ()drop استفاده نمایید:

import pymongo

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

mycol.drop()

کد بالا جدول مشتریان (customers) را به طور کامل حذف می کند. توجه داشته باشید که اگر عملیات موفقیت آمیز باشد، متد ()drop مقدار true و در غیر این صورت مقدار false را برمی گرداند.

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

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