Thuta Learning
ရှာဖွေရန်
ProjectsData & Databasesintermediate

Mini Project: Task Manager Database — Part 2 (Query နှင့် Update Feature)

စိတ်လျှော့ပါ။ ဒီခန်းကို စာအုပ်လိုမဟုတ်ဘဲ စကားပြောသလိုပဲ၊ နားလည်လွယ်အောင် ရှင်းပါမယ်။

ဒီခန်းပြီးရင် ဘာတတ်သွားမလဲ

  • Mini Project: Task Manager Database — Part 2 (Query နှင့် Update Feature) ကို လက်တွေ့ project ထဲမှာ အသုံးချတတ်မယ်
  • ကိုယ်တိုင် code ရေးပြီး run ကြည့်တတ်မယ်
  • Project တစ်ခုလုံးကို အဆင့်လိုက် ဆောက်တတ်မယ်

ခဏလေး ဒီလိုပဲ စဉ်းစားကြည့်

Task Manager application တစ်ခုအနေနဲ့ အသုံးအများဆုံး feature တွေက status အလိုက် filter လုပ်ခြင်း၊ task ကို complete အဖြစ် mark လုပ်ခြင်း၊ overdue task များကို ရှာဖွေခြင်း စတာတွေပါ။ ဒီအဆင့်မှာ query filter, comparison operators ($lt, $gt), update operators ($set, $currentDate) နှင့် updateOne/updateMany တို့ကို Part 1 ရဲ့ data ပေါ်မှာ တိုက်ရိုက်လက်တွေ့ကျင့်ကြည့်ပါမယ်။ Real app တစ်ခုမှာ user က filter/search/update လုပ်တဲ့အခါ backend ကနေ ဒီလို query တွေကို run လုပ်ရတာဖြစ်ပြီး ဒီ practice က production code ပုံစံနဲ့ တော်တော်နီးစပ်ပါတယ်။ Query နဲ့ update logic ကို မှန်ကန်စွာ ရေးနိုင်ရင် Part 3 ရဲ့ aggregation report တွေအတွက်လည်း အခြေခံကောင်းတစ်ခု ရရှိမှာပါ။

လက်တွေ့ ဆောက်ကြည့်မယ်

ပထမဆုံး status: "pending" ဖြစ်ပြီး priority: "high" ဖြစ်တဲ့ task များကို find() နဲ့ query filter ချကြည့်ပါ။ ပြီးရင် task တစ်ခုကို title နဲ့ ရှာပြီး updateOne() အသုံးပြု၍ status ကို "completed" ပြောင်းပါ — $set operator နဲ့အတူ $currentDate operator ကိုပါ သုံးပြီး updatedAt timestamp field တစ်ခု အလိုအလျောက်ထည့်ပါ။ နောက်ဆုံး dueDate က ယနေ့ထက်စောပြီး status: "pending" ဖြစ်နေသေးတဲ့ task အားလုံးကို updateMany() နဲ့ overdue: true flag တင်ပါ — dueDate: { $lt: new Date() } ဆိုတဲ့ comparison operator ကို filter မှာ သုံးပါ။

Code နမူနာ

javascript
// status = pending နှင့် priority = high ဖြစ်တဲ့ task များကို ရှာပါ
db.tasks.find({ status: "pending", priority: "high" })

// task တစ်ခုကို completed ပြောင်းပြီး updatedAt timestamp ထည့်ပါ
db.tasks.updateOne(
  { title: "Fix login bug" },
  {
    $set: { status: "completed" },
    $currentDate: { updatedAt: true }
  }
)

// dueDate ကျော်နေတဲ့ pending task အားလုံးကို overdue flag တင်ပါ
db.tasks.updateMany(
  { status: "pending", dueDate: { $lt: new Date() } },
  { $set: { overdue: true } }
)

// ပြောင်းလဲမှုများကို confirm လုပ်ပါ
db.tasks.find().pretty()
You should see
updateOne() နှင့် updateMany() run ပြီးတိုင်း matchedCount နှင့် modifiedCount ကို ပြန်ပေးပြီး၊ ပြန် find() ကြည့်လျှင် status, updatedAt, overdue field များ ပြောင်းလဲသွားသည်ကို တွေ့ရမည်။

၅ မိနစ် စမ်းကြည့်

priority: "low" ဖြစ်တဲ့ task များကို ရှာပြီး updateMany() နဲ့ priority ကို "medium" သို့ တစ်ပြိုင်နက်တည်း ပြောင်းကြည့်ပါ — matchedCount နှင့် modifiedCount ကွာခြားချက်ရှိမရှိ ၅ မိနစ်အတွင်း စစ်ဆေးကြည့်ပါ။

သတိလေးတစ်ချက်

updateMany() ကို production data ပေါ်မှာ run လုပ်ခင် filter condition ကို find() နဲ့ အရင် test run လုပ်ပြီး ဘယ် document တွေ ထိမှာလဲ သေချာစစ်ဆေးပါ — filter ကျယ်လွန်းရင် document များစွာ မလိုလားအပ်ဘဲ update ဖြစ်သွားနိုင်သည်။

ဒီနေရာမှာ လူအများမှားတတ်တယ်

  • updateOne() ကို document အများကြီးကို ပြောင်းချင်တဲ့အခါမှာလည်း သုံးမိပြီး document တစ်ခုပဲ update ဖြစ်တာကို မသတိထားမိတတ်သည်
  • $set operator မပါဘဲ update value ကို တိုက်ရိုက်ရေးမိပြီး document တစ်ခုလုံး (field တွေအားလုံး) အစားထိုးခံရတတ်သည်

အခု ကိုယ်တိုင် စမ်းကြည့်

priority: "low" ဖြစ်တဲ့ task များကို ရှာပြီး updateMany() နဲ့ priority ကို "medium" သို့ တစ်ပြိုင်နက်တည်း ပြောင်းကြည့်ပါ — matchedCount နှင့် modifiedCount ကွာခြားချက်ရှိမရှိ ၅ မိနစ်အတွင်း စစ်ဆေးကြည့်ပါ။

You'll know it worked when: updateOne() နှင့် updateMany() run ပြီးတိုင်း matchedCount နှင့် modifiedCount ကို ပြန်ပေးပြီး၊ ပြန် find() ကြည့်လျှင် status, updatedAt, overdue field များ ပြောင်းလဲသွားသည်ကို တွေ့ရမည်။

Mini Project: Task Manager Database — Part 2 (Query နှင့် Update Feature) | Thuta Learning