ডকুমেন্ট কোয়েরি করার এবং তারপর ডেটা ডিলিট বা মডিফাই করার জন্য ডেটা পাইপলাইন তৈরি করতে ডেটা ম্যানিপুলেশন ল্যাঙ্গুয়েজ (DML) update(...) এবং delete(...) পর্যায়গুলো ব্যবহার করুন।
সংস্করণের প্রয়োজনীয়তা
এই পৃষ্ঠায় বর্ণিত কার্যক্রমগুলোর জন্য ফায়ারস্টোর এন্টারপ্রাইজ সংস্করণ প্রয়োজন।
শুরু করার আগে
পাইপলাইন অপারেশন ব্যবহার করে কীভাবে ডাটাবেস কোয়েরি করতে হয়, সে সম্পর্কে আপনার ধারণা থাকা উচিত।
নথি আপডেট করুন
ডকুমেন্ট কোয়েরি করতে এবং তারপর ডেটা যোগ বা পরিবর্তন করতে পারে এমন ডেটা পাইপলাইন তৈরি করতে update(...) DML স্টেজটি ব্যবহার করুন।
সমস্ত DML পর্যায় অবশ্যই পাইপলাইনের শেষে থাকতে হবে। এই পর্যায়ে আসা ডকুমেন্টগুলিতে অবশ্যই __name__ ফিল্ডটি অন্তর্ভুক্ত থাকতে হবে, যা দিয়ে কোন ডকুমেন্টগুলি আপডেট করতে হবে তা শনাক্ত করা হয়। আপনি যে ডকুমেন্টগুলি আপডেট করার চেষ্টা করছেন তার কোনোটি যদি বিদ্যমান না থাকে, তাহলে অপারেশনটি ব্যর্থ হবে।
উদাহরণস্বরূপ, নিম্নলিখিত অপারেশনটি একটি কালেকশন গ্রুপের সমস্ত ডকুমেন্টে ডেটা মডেলের পরিবর্তন ব্যাকফিল করে। এই পাইপলাইনটি users কালেকশন গ্রুপের সেই সমস্ত ডকুমেন্টে একটি preferences.color ফিল্ড যোগ করে, যেগুলিতে সেই ফিল্ডটি নেই।
নোড.জেএস
const snapshot = await db.pipeline() .collectionGroup("users") .where(not(exists(field("preferences.color")))) .addFields(constant(null).as("preferences.color")) .removeFields("color") .update() .execute();
পাইথন
from google.cloud.firestore_v1.pipeline_expressions import Constant, Field, Not snapshot = ( client.pipeline() .collection_group("users") .where(Not(Field.of("preferences.color").exists())) .add_fields(Constant.of(None).as_("preferences.color")) .remove_fields("color") .update() .execute() )
জাভা
Pipeline.Snapshot snapshot = firestore.pipeline() .collectionGroup("users") .where(not(exists(field("preferences.color")))) .addFields(constant((String) null).as("preferences.color")) .removeFields("color") .update() .execute().get();
নথি মুছে ফেলুন
ডকুমেন্ট কোয়েরি করার এবং তারপর ডেটা ডিলিট করার জন্য ডেটা পাইপলাইন তৈরি করতে delete(...) স্টেজ DML ব্যবহার করুন। ভুলবশত একসাথে অনেক ডেটা ডিলিট হওয়া রোধ করতে, delete(...) দিয়ে শেষ হওয়া পাইপলাইনগুলিতে অন্তত একটি where(...) স্টেজ থাকা উচিত। সমস্ত DML স্টেজ অবশ্যই পাইপলাইনের শেষে থাকতে হবে।
উদাহরণস্বরূপ, নিম্নলিখিত পাইপলাইনটি সেই সমস্ত users ডকুমেন্ট মুছে ফেলে যাদের address.users মান USA এবং __create_time__ মান ১০ দিনের কম:
নোড.জেএস
const pipeline = db.pipeline() .collectionGroup("users") .where(field("address.country").equal("USA")) .where(field("__create_time__").timestampAdd("day", 10).lessThan(currentTimestamp())) .delete(); await pipeline.execute();
পাইথন
from google.cloud.firestore_v1.pipeline_expressions import CurrentTimestamp, Field snapshot = ( client.pipeline() .collection_group("users") .where(Field.of("address.country").equal("USA")) .where( Field.of("__create_time__") .timestamp_add("day", 10) .less_than(CurrentTimestamp()) ) .delete() .execute() )
জাভা
Pipeline.Snapshot deleteResults = firestore.pipeline() .collectionGroup("users") .where(field("address.country").equal("USA")) .where(field("__create_time__").add(constant(10)).lessThan(currentTimestamp())) .delete() .execute().get();
সামঞ্জস্য
ট্রানজ্যাকশনের মধ্যে update(...) এবং delete() ধাপের পাইপলাইন অপারেশন সমর্থিত নয়। DML ধাপগুলো ট্রানজ্যাকশনের বাইরে নিম্নলিখিত আচরণ সহ চলে:
- প্রতিটি ডকুমেন্ট স্বাধীনভাবে আপডেট করা হয়। এর মানে হলো, অপারেশনগুলো ডকুমেন্টজুড়ে এককভাবে কাজ করে না। প্রথম ত্রুটিতেই অপারেশনটি ব্যর্থ হয় এবং আংশিক সাফল্যও সম্ভব।
- নিম্নলিখিত পর্যায়গুলি সমর্থিত:
-
collection(...) -
collection_group(...) -
where(...) -
select(...) -
add_fields(...) -
remove_fields(...) -
let(...) -
sort(...) -
limit(...) -
offset(...)
-
- নিম্নলিখিত পর্যায়গুলি সমর্থিত নয়:
-
aggregate(...) -
distinct(...) -
unnest(...) -
find_nearest(...) - DML স্টেজের আগে
union(...), join, এবং sub-query-এর মতো একাধিক কোয়েরির ধাপ অনুমোদিত নয়।
-
সীমাবদ্ধতা
DML পর্যায়গুলির জন্য নিম্নলিখিত সীমাবদ্ধতাগুলি লক্ষ্য করুন:
-
.execute()কল করার আগে, একটি পাইপলাইন সংজ্ঞায় DML পর্যায়গুলো অবশ্যই সর্বশেষ পর্যায় হতে হবে। - একটি ট্রানজ্যাকশনের মধ্যে
update(...)এবংdelete()ধাপযুক্ত পাইপলাইন অপারেশন সমর্থিত নয়। - যদি DML ধাপের পূর্ববর্তী ধাপে একই
__name__সহ একাধিক ডকুমেন্ট তৈরি হয়, তবে প্রতিটি ইনস্ট্যান্স প্রসেস করা হয়।update(...)এর ক্ষেত্রে, এর অর্থ হলো একই টার্গেট ডকুমেন্ট একাধিকবার পরিবর্তিত হতে পারে।delete(...)এর ক্ষেত্রে, প্রথমটির পরের প্রচেষ্টাগুলো নিষ্ক্রিয় থাকবে।