Firebase এর হাতেখড়ি (পর্ব ৬) – Write অপারেশন: set(), push(), update()

Firebase Realtime Database Write অপারেশন

আগের পর্বে ref() দিয়ে ডেটাবেজের path-এ পৌঁছানো শিখেছিলাম, কিন্তু আসল ডেটা লেখা হয়নি। এই পর্বে শিখব RTDB-তে ডেটা লেখার তিনটা প্রধান ফাংশন — set(), push(), আর update() — আর এই তিনটার মধ্যে পার্থক্য কী।

set() — নির্দিষ্ট path-এ ডেটা বসানো

set() একটা নির্দিষ্ট path-এ সম্পূর্ণ নতুন ডেটা বসিয়ে দেয় — যদি সেখানে আগে থেকে কিছু থাকে, সেটা পুরোপুরি মুছে গিয়ে নতুন ডেটা বসবে।

import { getDatabase, ref, set } from "firebase/database";
import { app } from "./firebase";

const db = getDatabase(app);

async function addBook() {
  await set(ref(db, "books/book1"), {
    title: "অপরাজিত",
    author: "বিভূতিভূষণ",
    year: 1932,
  });
  console.log("বই যোগ হয়েছে");
}

সতর্কতা: books/book1-এ যদি আগে থেকেই { title: "...", rating: 5 } থাকে, আর নতুন set() কল করেন শুধু { title: "..." } দিয়ে, তাহলে rating ফিল্ডটা হারিয়ে যাবে — কারণ পুরো নোডটাই প্রতিস্থাপিত হয়।

push() — অটো-জেনারেটেড ID দিয়ে নতুন এন্ট্রি যোগ

যখন একটা লিস্টে নতুন আইটেম যোগ করতে হয় আর ID নিজে ঠিক করতে চান না, তখন push() ব্যবহার হয় — Firebase নিজে থেকেই একটা ইউনিক, সময়ানুক্রমিক ID বানিয়ে দেয়।

import { getDatabase, ref, push } from "firebase/database";
import { app } from "./firebase";

const db = getDatabase(app);

async function addBookAuto(title, author) {
  const newBookRef = push(ref(db, "books"));
  await set(newBookRef, { title, author });
  console.log("নতুন বইয়ের ID:", newBookRef.key); // যেমন -Nx1abc123
}

এক লাইনে সংক্ষেপে লেখারও উপায় আছে — push()-এর দ্বিতীয় আর্গুমেন্টে সরাসরি ডেটা দেওয়া যায়:

async function addBookShortcut(title, author) {
  await push(ref(db, "books"), { title, author });
}

এখানেই push() আর set()-এর মূল পার্থক্য — set()-এ path আপনি ঠিক করে দেন, push()-এ Firebase নিজে child ID বানিয়ে দেয়।

update() — শুধু নির্দিষ্ট ফিল্ড বদলানো

set()-এর মতো পুরো নোড মুছে না দিয়ে, update() শুধু নির্দিষ্ট ফিল্ডগুলো বদলায় — বাকি ডেটা অক্ষত থাকে।

import { getDatabase, ref, update } from "firebase/database";
import { app } from "./firebase";

const db = getDatabase(app);

async function updateRating(bookId, newRating) {
  await update(ref(db, `books/${bookId}`), {
    rating: newRating,
    // title, author ইত্যাদি অন্য ফিল্ড অক্ষত থাকবে
  });
}

update()-এর আরেকটা শক্তিশালী ব্যবহার — একসাথে একাধিক আলাদা path আপডেট করা, যা multi-path update নামে পরিচিত।

// একই সাথে দুইটা ভিন্ন জায়গায় ডেটা আপডেট — দুটোই একসাথে সফল বা একসাথে ব্যর্থ হবে
async function moveBookOwner(bookId, oldOwnerId, newOwnerId) {
  const updates = {};
  updates[`books/${bookId}/ownerId`] = newOwnerId;
  updates[`users/${oldOwnerId}/bookCount`] = 0;
  updates[`users/${newOwnerId}/bookCount`] = 1;

  await update(ref(db), updates); // রুট থেকে, তাই ফুল path লাগবে
}

এটা atomic — অর্থাৎ কোনো একটা path আপডেট ব্যর্থ হলে বাকি কোনোটাই হবে না, তাই ডেটা কখনো অর্ধেক-আপডেট অবস্থায় থাকবে না।

তিনটার মধ্যে পার্থক্য এক নজরে

ফাংশন কাজ কখন ব্যবহার
set() পুরো নোড প্রতিস্থাপন নির্দিষ্ট path-এ সম্পূর্ণ নতুন ডেটা বসাতে
push() নতুন ID দিয়ে যোগ লিস্টে নতুন আইটেম যোগ করতে
update() শুধু নির্দিষ্ট ফিল্ড বদলানো আংশিক আপডেট, একাধিক path একসাথে

লাইভ ডেমো — set, push, update (সিমুলেটেড)

নিচে তিনটা ফাংশনের আচরণ একটা সিমুলেটেড JSON ট্রি-তে দেখানো হয়েছে — বোতাম চেপে দেখো প্রতিটা ডেটাকে কীভাবে আলাদাভাবে প্রভাবিত করে।

প্রথমে set() চেপে দেখো rating ফিল্ড হারিয়ে যাচ্ছে, তারপর রিসেট করে update() চেপে দেখো rating ঠিকমতো বদলাচ্ছে কিন্তু বাকি ফিল্ড থাকছে।

নিজে চেষ্টা করো

Exercise:

  1. নিজের ডেটাবেজে set() দিয়ে একটা বই যোগ করো, তারপর আবার set() কল করে দেখো আগের ডেটা কীভাবে হারিয়ে যায়।
  2. push() দিয়ে ৩টা বই যোগ করো, Console-এ Data ট্যাবে গিয়ে দেখো প্রতিটার ID কেমন দেখতে।
  3. update() দিয়ে একটা বইয়ের শুধু rating ফিল্ড বদলাও, বাকি ফিল্ড ঠিক আছে কিনা যাচাই করো।
  4. একটা multi-path update() লিখে দুইটা ভিন্ন path একসাথে আপডেট করার চেষ্টা করো।

পরের পর্বে যা থাকছে

পরের পর্বে আমরা শিখব Read, Query ও Paginationget(), onValue() দিয়ে ডেটা পড়া, লাইভ আপডেট শোনা, আর orderByChild, limitToFirst দিয়ে ফিল্টার করা।

একটি মন্তব্য পোস্ট করুন

নবীনতর পূর্বতন

যোগাযোগ ফর্ম