پایتون و MongoDB: توابع Update و Limit

25 آبان 1398
پایتون و MongoDB: توابع Update و Limit

آشنایی با تابع Update

برخی اوقات که برخی از داده ها را وارد پایگاه داده می کنیم، لازم است که بعدا آن ها را ویرایش کنیم. به طور مثال اگر کاربری حساب خود را شارژ کند باید اعتبار حساب او در پنل کاربری اش افزایش پیدا کند و یا اگر کاربری بخواهد ایمیل، نام، شماره تلفن و دیگر اطلاعات خود را تغییر بدهد، باید بتواند از طریق منوی کاربری این کار را انجام دهد. فلسفه ی وجودی تابع ()update_one در زبان پایتون نیز همین است! تابع ()update_one در پارامتر اول خود یک شیء کوئری می گیرد و بر اساس آن کوئری، یک ردیف را بروز رسانی خواهد کرد. به قسمت «یک ردیف» توجه داشته باشید؛ تابع ()update_one فقط و فقط یک ردیف را بروزرسانی خواهد کرد حتی اگر شیء کوئری ما بیشتر از یک ردیف را پیدا کند.

سوال: منظور از شیء کوئری (query object) چیست؟

پاسخ: شیء کوئری یک شیء ساده است (علامت های {}) که درون خود کوئری خاصی دارد. منظور ما از کوئری استفاده از زبان برقراری ارتباط با پایگاه داده ی MongoDB است.

پارامتر دوم تابع ()update_one نیز یک شیء است که مقدار جدید ردیف را در خود دارد؛ مثلا اگر کاربر را نام کاربری اش را از AmirZM به Amir Zouerami تغییر دهد، در شیء دوم مقدار Amir Zouerami قرار خواهد گرفت. در مثال زیر می خواهیم آدرس Valley 345 را پیدا کرده و آن را به Canyon 123 تغییر دهیم:

import pymongo

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

myquery = { "address": "Valley 345" }
newvalues = { "$set": { "address": "Canyon 123" } }

mycol.update_one(myquery, newvalues)

#print "customers" after the update:
for x in mycol.find():
  print(x)

در کد بالا myquery همان شیء کوئری ما و newvalues نیز همان پارامتر دوم تابع است که با استفاده از set آدرس جدید را جایگزین می نماید. در خط آخر این کد customers را چاپ کرده ایم تا مقدار تغییر داده شده را مشاهده کنیم. خروجی:

{'_id': 1, 'name': 'John', 'address': 'Highway37'}
{'_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': 'Canyon 123'}
{'_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 = 5 دارای آدرس Canyon 123 شده است.

در عین حال اگر بخواهیم تمام نتایج را (هر تعداد نتیجه ای که شیء کوئری برگرداند) ویرایش کنیم باید از تابع دیگری به نام ()update_many استفاده کنیم. این تابع برخلاف تابع ()update_one که تنها نتیجه ی اول را ویرایش می کرد، هر نتیجه ای که توسط شیء کوئری برگردانده شود را ویرایش خواهد کرد. برای مثال در کد زیر می خواهیم هر آدرسی که با حرف S شروع شده باشد را ویرایش کنیم:

import pymongo

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

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

newvalues = { "$set": { "name": "Minnie" } }

x = mycol.update_many(myquery, newvalues)

print(x.modified_count, "documents updated.")

در این کد نام تمام افرادی را که آدرس آنها با حرف S شروع می شد، تغییر داده و نام Minnie را برایشان انتخاب کرده ایم. خروجی:

2 documents updated.

تابع limit

برخی اوقات کوئری ما به پایگاه داده نتایج بسیار زیادی دارد. زمانی که فقط با چند ردیف از نتایج برگردانده شده کار داریم، برگرداندن تمام این نتایج به سمت برنامه اصلا کار عاقلانه ای نیست چرا که باعث درگیر شدن منابع سرور می شود. در چنین مواقعی می توانیم از تابعی به نام ()limit استفاده کنیم که نتایج را محدود میکند. این تابع یک پارامتر می گیرد و آن پارامتر مشخص میکند که تعداد ردیف (document) های برگشتی چند عدد باشد.

به طور مثال تصور کنید که یک جدول به نام customers دارید که محتوای آن بدین شکل است:

{'_id': 1, 'name': 'John', 'address': 'Highway37'}
{'_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'}

حالا اگر بخواهیم تنها 5 ردیف از این جدول را برگردانیم باید به روش زیر عمل کنیم:

import pymongo

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

myresult = mycol.find().limit(5)

#print the result:
for x in myresult:
  print(x)

عدد 5 در تابع limit به معنی برگرداندن 5 نتیجه ی اول است بنابراین خروجی این کد به شکل زیر خواهد بود:

{'_id': 1, 'name': 'John', 'address': 'Highway37'}
{'_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'}

جمع بندی

ما در طی جلسات گذشته از آموزش زبان پایتون با هر دو پایگاه داده ی MySQL و MongoDB کار کردیم و مطمئن هستم که شما هم با من بر سر این موضوع توافق دارید: MySQL و MongoDB از مشهور ترین پایگاه های داده ی دنیا هستند و هر دو برای پروژه های شما قابل اطمینان می باشند. شما می توانید بر اساس نیاز خود یکی از این دو پایگاه داده را انتخاب کرده و آن را در پروژه های پایتونی خود استفاده کنید.

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

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

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