به روزرسانی داده‌های سند MongoDB با استفاده از خط فرمان mongo

در این بخش، به به‌روزرسانی داده‌های سند MongoDB از طریق خط فرمان mongo می‌پردازیم. MongoDB از روش‌های مختلفی برای به‌روزرسانی از طریق اپراتورهای مختلف پشتیبانی می‌کند و همچنین از چندین تابع به‌روزرسانی حمایت می‌کند.

آماده‌سازی داده‌های آزمایشی

یک دسته‌ی داده‌های آزمایشی را در مجموعه inventory درج کنید.

db.inventory.insertMany( [
   { item: "canvas", qty: 100, size: { h: 28, w: 35.5, uom: "cm" }, status: "A" },
   { item: "journal", qty: 25, size: { h: 14, w: 21, uom: "cm" }, status: "A" },
   { item: "mat", qty: 85, size: { h: 27.9, w: 35.5, uom: "cm" }, status: "A" },
   { item: "mousepad", qty: 25, size: { h: 19, w: 22.85, uom: "cm" }, status: "P" },
   { item: "notebook", qty: 50, size: { h: 8.5, w: 11, uom: "in" }, status: "P" },
   { item: "paper", qty: 100, size: { h: 8.5, w: 11, uom: "in" }, status: "D" },
   { item: "planner", qty: 75, size: { h: 22.85, w: 30, uom: "cm" }, status: "D" },
   { item: "postcard", qty: 45, size: { h: 10, w: 15.25, uom: "cm" }, status: "A" },
   { item: "sketchbook", qty: 80, size: { h: 14, w: 21, uom: "cm" }, status: "A" },
   { item: "sketch pad", qty: 95, size: { h: 22.85, w: 30.5, uom: "cm" }, status: "A" }
] );

دستور نویسی اپراتور به‌روزرسانی

برای به‌روزرسانی اسناد، MongoDB اپراتورهای به‌روزرسانی متعدد را فراهم می‌کند (به عنوان مثال، $set) تا ارزش‌های فیلد را اصلاح کند.

فرمت پارامترهای اپراتور به‌روزرسانی به صورت زیر است:

{
  <اپراتور به‌روزرسانی>: { <فیلد۱>: <ارزش۱>, ... },
  <اپراتور به‌روزرسانی>: { <فیلد۲>: <ارزش۲>, ... },
  ...
}

توضیح:

  • <اپراتور به‌روزرسانی>: اپراتور به‌روزرسانی
  • <فیلد۱>: نام فیلد
  • <ارزش۱>: پارامتر فیلد

اپراتور $set

برای به‌روزرسانی اسناد و ایجاد یک فیلد جدید اگر فیلد وجود نداشته باشد استفاده می‌شود.

به‌روزرسانی یک سند

استفاده از متد db.collection.updateOne() برای به‌روزرسانی یک سند.

db.inventory.updateOne(
   { item: "paper" },
   {
     $set: { "size.uom": "cm", status: "P" },
     $currentDate: { lastModified: true }
   }
)

توضیح به‌روزرسانی:

  • ابتدا، با استفاده از شرط پرس‌وجو (item = paper)، اسند اول را بازیابی کنید.
  • از اپراتور $set برای به‌روزرسانی ارزش فیلد size.uom به cm و به‌روزرسانی ارزش فیلد status به P استفاده کنید.
  • از اپراتور $currentDate برای به‌روزرسانی ارزش فیلد lastModified به تاریخ جاری استفاده کنید. اگر فیلد lastModified وجود نداشته باشد، $currentDate این فیلد را ایجاد خواهد کرد.

به‌روزرسانی چندین سند

از متد db.collection.updateMany() برای به‌روزرسانی چندین سند که شرط را برآورده می‌سازند استفاده کنید.

db.inventory.updateMany(
   { "qty": { $lt: 50 } },
   {
     $set: { "size.uom": "in", status: "P" },
     $currentDate: { lastModified: true }
   }
)

توضیح به‌روزرسانی:

  • ابتدا، تمامی اسند‌ها را با استفاده از شرط پرس‌وجو (qty < 50) بازیابی کنید.
  • از اپراتور $set برای به‌روزرسانی ارزش فیلد size.uom به in و به‌روزرسانی ارزش فیلد status به P استفاده کنید.
  • از اپراتور $currentDate برای به‌روزرسانی ارزش فیلد lastModified به تاریخ جاری استفاده کنید. اگر فیلد lastModified وجود نداشته باشد، $currentDate این فیلد را ایجاد خواهد کرد.

نکته: اپراتور $lt معنای کمتر از را نمایان می‌کند.

جایگزینی سند

از متد db.collection.replaceOne() برای جایگزینی محتوای یک سند (به جز فیلد _id) استفاده کنید. سند جایگزین می‌تواند فیلدهای مختلفی نسبت به سند اصلی داشته باشد. از آنجا که فیلد _id غیرقابل تغییر است، می‌تواند حذف شود. اما اگر فیلد _id را در برگه دوم از متد replaceOne اضافه کنید، مقدار آن باید با مقدار id سندی که در حال بروزرسانی است، سازگار باشد.

db.inventory.replaceOne(
   { item: "paper" },
   { item: "paper", instock: [ { warehouse: "A", qty: 60 }, { warehouse: "B", qty: 40 } ] }
)

توضیحات:

  • ابتدا از معیارهای پرس و جو (item=paper) برای بازیابی اولین سند استفاده می‌شود.
  • سند مطابقت دار را با محتوای پارامتر دوم متد replaceOne جایگزین کنید.

رفتار به‌روزرسانی

اتمیت

تمام عملیات نوشتن در MongoDB به صورت اتمیک در سطح فردی سند هستند.

فیلد _id

فیلد _id غیرقابل تغییر است و نمی‌تواند به‌روزرسانی شود.