ক্লাউড ফায়ারস্টোর ট্রিগার করে


Cloud Functions সাহায্যে, আপনি ক্লাউড ফায়ারস্টোরে ক্লায়েন্ট কোড আপডেট করার প্রয়োজন ছাড়াই ইভেন্টগুলি পরিচালনা করতে পারেন৷ আপনি ডকুমেন্ট স্ন্যাপশট ইন্টারফেসের মাধ্যমে বা অ্যাডমিন SDK-এর মাধ্যমে ক্লাউড ফায়ারস্টোর পরিবর্তন করতে পারেন।

একটি সাধারণ জীবনচক্রে, একটি ক্লাউড ফায়ারস্টোর ফাংশন নিম্নলিখিতগুলি করে:

  1. একটি নির্দিষ্ট নথিতে পরিবর্তনের জন্য অপেক্ষা করে।
  2. একটি ঘটনা ঘটলে ট্রিগার করে এবং তার কার্য সম্পাদন করে।
  3. নির্দিষ্ট নথিতে সংরক্ষিত ডেটার একটি স্ন্যাপশট ধারণ করে এমন একটি ডেটা অবজেক্ট গ্রহণ করে। ইভেন্টগুলি লিখতে বা আপডেট করার জন্য, ডেটা অবজেক্টে দুটি স্ন্যাপশট থাকে যা ট্রিগারিং ইভেন্টের আগে এবং পরে ডেটার অবস্থা উপস্থাপন করে।

ফায়ারস্টোর ইনস্ট্যান্সের অবস্থান এবং ফাংশনের অবস্থানের মধ্যে দূরত্ব উল্লেখযোগ্য নেটওয়ার্ক লেটেন্সি তৈরি করতে পারে। কর্মক্ষমতা অপ্টিমাইজ করতে, যেখানে প্রযোজ্য সেখানে ফাংশন অবস্থান নির্দিষ্ট করার কথা বিবেচনা করুন।

ক্লাউড ফায়ারস্টোর ফাংশন ট্রিগার করে

Cloud Functions for Firebase নিম্নলিখিত ক্লাউড ফায়ারস্টোর ইভেন্ট ট্রিগারগুলি রপ্তানি করে যাতে আপনি নির্দিষ্ট ক্লাউড ফায়ারস্টোর ইভেন্টের সাথে আবদ্ধ হ্যান্ডলার তৈরি করতে পারেন:

Node.js

ইভেন্টের ধরন ট্রিগার
onDocumentCreated যখন একটি নথিতে প্রথমবার লেখা হয় তখন ট্রিগার হয়৷
onDocumentUpdated ট্রিগার হয় যখন একটি ডকুমেন্ট আগে থেকেই থাকে এবং কোনো মান পরিবর্তন হয়।
onDocumentDeleted একটি নথি মুছে ফেলা হলে ট্রিগার হয়।
onDocumentWritten onDocumentCreated , onDocumentUpdated বা onDocumentDeleted ট্রিগার হলে ট্রিগার হয়।
onDocumentCreatedWithAuthContext onDocumentCreated অতিরিক্ত প্রমাণীকরণ তথ্য সহ
onDocumentWrittenWithAuthContext অতিরিক্ত প্রমাণীকরণ তথ্য সহ onDocumentWritten
onDocumentDeletedWithAuthContext onDocumentDeleted অতিরিক্ত প্রমাণীকরণ তথ্য সহ মুছে ফেলা হয়েছে
onDocumentUpdatedWithAuthContext অতিরিক্ত প্রমাণীকরণ তথ্য সহ onDocumentUpdated

পাইথন (প্রিভিউ)

ইভেন্টের ধরন ট্রিগার
on_document_created যখন একটি নথিতে প্রথমবার লেখা হয় তখন ট্রিগার হয়৷
on_document_updated ট্রিগার হয় যখন একটি ডকুমেন্ট আগে থেকেই থাকে এবং কোনো মান পরিবর্তন হয়।
on_document_deleted একটি নথি মুছে ফেলা হলে ট্রিগার হয়।
on_document_written on_document_created , on_document_updated বা on_document_deleted ট্রিগার হলে ট্রিগার হয়।
on_document_created_with_auth_context অতিরিক্ত প্রমাণীকরণ তথ্য সহ on_document_created
on_document_updated_with_auth_context অতিরিক্ত প্রমাণীকরণ তথ্য সহ on_document_updated
on_document_deleted_with_auth_context অতিরিক্ত প্রমাণীকরণ তথ্য সহ on_document_deleted
on_document_written_with_auth_context অতিরিক্ত প্রমাণীকরণ তথ্য সহ on_document_written

ক্লাউড ফায়ারস্টোর ইভেন্টগুলি শুধুমাত্র ডকুমেন্ট পরিবর্তনের উপর ট্রিগার করে। একটি ক্লাউড ফায়ারস্টোর নথিতে একটি আপডেট যেখানে ডেটা অপরিবর্তিত থাকে (একটি নো-অপ লেখা) একটি আপডেট বা লেখার ইভেন্ট তৈরি করে না। নির্দিষ্ট ক্ষেত্রে ইভেন্ট যোগ করা সম্ভব নয়।

আপনার যদি এখনও Cloud Functions for Firebase জন্য কোনও প্রকল্প সক্রিয় না থাকে, তাহলে Cloud Functions for Firebase কনফিগার এবং সেট আপ করতে Cloud Functions for Firebase দিয়ে শুরু করুন পড়ুন৷

ক্লাউড ফায়ারস্টোর-ট্রিগার করা ফাংশন লেখা

একটি ফাংশন ট্রিগার সংজ্ঞায়িত করুন

একটি ক্লাউড ফায়ারস্টোর ট্রিগার সংজ্ঞায়িত করতে, একটি নথির পথ এবং একটি ইভেন্টের ধরন নির্দিষ্ট করুন:

Node.js

import {
  onDocumentWritten,
  onDocumentCreated,
  onDocumentUpdated,
  onDocumentDeleted,
  Change,
  FirestoreEvent
} from "firebase-functions/v2/firestore";

exports.myfunction = onDocumentWritten("my-collection/{docId}", (event) => {
   /* ... */ 
});

পাইথন (প্রিভিউ)

from firebase_functions.firestore_fn import (
  on_document_created,
  on_document_deleted,
  on_document_updated,
  on_document_written,
  Event,
  Change,
  DocumentSnapshot,
)

@on_document_created(document="users/{userId}")
def myfunction(event: Event[DocumentSnapshot]) -> None:

নথির পাথগুলি একটি নির্দিষ্ট নথি বা একটি ওয়াইল্ডকার্ড প্যাটার্ন উল্লেখ করতে পারে।

একটি একক নথি উল্লেখ করুন

আপনি যদি একটি নির্দিষ্ট নথিতে কোনও পরিবর্তনের জন্য একটি ইভেন্ট ট্রিগার করতে চান তবে আপনি নিম্নলিখিত ফাংশনটি ব্যবহার করতে পারেন।

Node.js

import {
  onDocumentWritten,
  Change,
  FirestoreEvent
} from "firebase-functions/v2/firestore";

exports.myfunction = onDocumentWritten("users/marie", (event) => {
  // Your code here
});

পাইথন (প্রিভিউ)

from firebase_functions.firestore_fn import (
  on_document_written,
  Event,
  Change,
  DocumentSnapshot,
)

@on_document_written(document="users/marie")
def myfunction(event: Event[Change[DocumentSnapshot]]) -> None:

ওয়াইল্ডকার্ড ব্যবহার করে নথির একটি গ্রুপ নির্দিষ্ট করুন

আপনি যদি নথির একটি গোষ্ঠীতে একটি ট্রিগার সংযুক্ত করতে চান, যেমন একটি নির্দিষ্ট সংগ্রহের কোনো নথি, তাহলে নথি আইডির জায়গায় একটি {wildcard} ব্যবহার করুন:

Node.js

import {
  onDocumentWritten,
  Change,
  FirestoreEvent
} from "firebase-functions/v2/firestore";

exports.myfunction = onDocumentWritten("users/{userId}", (event) => {
  // If we set `/users/marie` to {name: "Marie"} then
  // event.params.userId == "marie"
  // ... and ...
  // event.data.after.data() == {name: "Marie"}
});

পাইথন (প্রিভিউ)

from firebase_functions.firestore_fn import (
  on_document_written,
  Event,
  Change,
  DocumentSnapshot,
)

@on_document_written(document="users/{userId}")
def myfunction(event: Event[Change[DocumentSnapshot]]) -> None:
  # If we set `/users/marie` to {name: "Marie"} then
  event.params["userId"] == "marie"  # True
  # ... and ...
  event.data.after.to_dict() == {"name": "Marie"}  # True

এই উদাহরণে, যখন users কোনো নথিতে কোনো ক্ষেত্র পরিবর্তন করা হয়, তখন এটি userId নামক ওয়াইল্ডকার্ডের সাথে মেলে।

যদি users মধ্যে একটি নথিতে উপসংগ্রহ থাকে এবং সেই উপসংগ্রহগুলির নথিগুলির একটিতে একটি ক্ষেত্র পরিবর্তন করা হয়, তাহলে userId ওয়াইল্ডকার্ডটি ট্রিগার হয় না

ওয়াইল্ডকার্ড ম্যাচ ডকুমেন্ট পাথ থেকে বের করে event.params এ সংরক্ষণ করা হয়। আপনি সুস্পষ্ট সংগ্রহ বা নথি আইডি প্রতিস্থাপন করতে চান যতগুলি ওয়াইল্ডকার্ড সংজ্ঞায়িত করতে পারেন, উদাহরণস্বরূপ:

Node.js

import {
  onDocumentWritten,
  Change,
  FirestoreEvent
} from "firebase-functions/v2/firestore";

exports.myfunction = onDocumentWritten("users/{userId}/{messageCollectionId}/{messageId}", (event) => {
    // If we set `/users/marie/incoming_messages/134` to {body: "Hello"} then
    // event.params.userId == "marie";
    // event.params.messageCollectionId == "incoming_messages";
    // event.params.messageId == "134";
    // ... and ...
    // event.data.after.data() == {body: "Hello"}
});

পাইথন (প্রিভিউ)

from firebase_functions.firestore_fn import (
  on_document_written,
  Event,
  Change,
  DocumentSnapshot,
)

@on_document_written(document="users/{userId}/{messageCollectionId}/{messageId}")
def myfunction(event: Event[Change[DocumentSnapshot]]) -> None:
  # If we set `/users/marie/incoming_messages/134` to {body: "Hello"} then
  event.params["userId"] == "marie"  # True
  event.params["messageCollectionId"] == "incoming_messages"  # True
  event.params["messageId"] == "134"  # True
  # ... and ...
  event.data.after.to_dict() == {"body": "Hello"}

আপনার ট্রিগার অবশ্যই একটি নথির দিকে নির্দেশ করবে, এমনকি আপনি যদি একটি ওয়াইল্ডকার্ড ব্যবহার করেন। উদাহরণস্বরূপ, users/{userId}/{messageCollectionId} বৈধ নয় কারণ {messageCollectionId} একটি সংগ্রহ। যাইহোক, users/{userId}/{messageCollectionId}/{messageId} বৈধ কারণ {messageId} সর্বদা একটি নথিতে নির্দেশ করবে৷

ইভেন্ট ট্রিগার

একটি নতুন নথি তৈরি করা হলে একটি ফাংশন ট্রিগার করুন

সংগ্রহে একটি নতুন নথি তৈরি করা হলে আপনি যে কোনো সময় ফায়ার করার জন্য একটি ফাংশন ট্রিগার করতে পারেন। এই উদাহরণ ফাংশন প্রতিবার একটি নতুন ব্যবহারকারী প্রোফাইল যোগ করা হলে ট্রিগার করে:

Node.js

import {
  onDocumentCreated,
  Change,
  FirestoreEvent
} from "firebase-functions/v2/firestore";

exports.createuser = onDocumentCreated("users/{userId}", (event) => {
    // Get an object representing the document
    // e.g. {'name': 'Marie', 'age': 66}
    const snapshot = event.data;
    if (!snapshot) {
        console.log("No data associated with the event");
        return;
    }
    const data = snapshot.data();

    // access a particular field as you would any JS property
    const name = data.name;

    // perform more operations ...
});

অতিরিক্ত প্রমাণীকরণ তথ্যের জন্য, onDocumentCreatedWithAuthContext ব্যবহার করুন।

পাইথন (প্রিভিউ)

from firebase_functions.firestore_fn import (
  on_document_created,
  Event,
  DocumentSnapshot,
)

@on_document_created(document="users/{userId}")
def myfunction(event: Event[DocumentSnapshot]) -> None:
  # Get a dictionary representing the document
  # e.g. {'name': 'Marie', 'age': 66}
  new_value = event.data.to_dict()

  # Access a particular field as you would any dictionary
  name = new_value["name"]

  # Perform more operations ...

একটি নথি আপডেট করা হলে একটি ফাংশন ট্রিগার করুন

একটি নথি আপডেট করা হলে আপনি ফায়ার করার জন্য একটি ফাংশন ট্রিগার করতে পারেন। এই উদাহরণ ফাংশন ফায়ার করে যদি একজন ব্যবহারকারী তাদের প্রোফাইল পরিবর্তন করে:

Node.js

import {
  onDocumentUpdated,
  Change,
  FirestoreEvent
} from "firebase-functions/v2/firestore";

exports.updateuser = onDocumentUpdated("users/{userId}", (event) => {
    // Get an object representing the document
    // e.g. {'name': 'Marie', 'age': 66}
    const newValue = event.data.after.data();

    // access a particular field as you would any JS property
    const name = newValue.name;

    // perform more operations ...
});

অতিরিক্ত প্রমাণীকরণ তথ্যের জন্য, onDocumentUpdatedWithAuthContext ব্যবহার করুন।

পাইথন (প্রিভিউ)

from firebase_functions.firestore_fn import (
  on_document_updated,
  Event,
  Change,
  DocumentSnapshot,
)

@on_document_updated(document="users/{userId}")
def myfunction(event: Event[Change[DocumentSnapshot]]) -> None:
  # Get a dictionary representing the document
  # e.g. {'name': 'Marie', 'age': 66}
  new_value = event.data.after.to_dict()

  # Access a particular field as you would any dictionary
  name = new_value["name"]

  # Perform more operations ...

একটি নথি মুছে ফেলা হলে একটি ফাংশন ট্রিগার

একটি নথি মুছে ফেলা হলে আপনি একটি ফাংশন ট্রিগার করতে পারেন। এই উদাহরণ ফাংশন ফায়ার করে যখন একজন ব্যবহারকারী তাদের ব্যবহারকারী প্রোফাইল মুছে দেয়:

Node.js

import {
  onDocumentDeleted,
  Change,
  FirestoreEvent
} from "firebase-functions/v2/firestore";

exports.deleteuser = onDocumentDeleted("users/{userId}", (event) => {
    // Get an object representing the document
    // e.g. {'name': 'Marie', 'age': 66}
    const snap =  event.data;
    const data =  snap.data();

    // perform more operations ...
});

অতিরিক্ত প্রমাণীকরণ তথ্যের জন্য, onDocumentDeletedWithAuthContext ব্যবহার করুন।

পাইথন (প্রিভিউ)

from firebase_functions.firestore_fn import (
  on_document_deleted,
  Event,
  DocumentSnapshot,
)

@on_document_deleted(document="users/{userId}")
def myfunction(event: Event[DocumentSnapshot|None]) -> None:
  # Perform more operations ...

একটি নথিতে সমস্ত পরিবর্তনের জন্য একটি ফাংশন ট্রিগার করুন

আপনি যদি ইভেন্টের ধরণ সম্পর্কে চিন্তা না করেন তবে আপনি "ডকুমেন্ট লিখিত" ইভেন্ট ট্রিগার ব্যবহার করে একটি ক্লাউড ফায়ারস্টোর নথিতে সমস্ত পরিবর্তন শুনতে পারেন৷ এই উদাহরণ ফাংশনটি চালু হয় যদি একজন ব্যবহারকারী তৈরি করা হয়, আপডেট করা হয় বা মুছে ফেলা হয়:

Node.js

import {
  onDocumentWritten,
  Change,
  FirestoreEvent
} from "firebase-functions/v2/firestore";

exports.modifyuser = onDocumentWritten("users/{userId}", (event) => {
    // Get an object with the current document values.
    // If the document does not exist, it was deleted
    const document =  event.data.after.data();

    // Get an object with the previous document values
    const previousValues =  event.data.before.data();

    // perform more operations ...
});

অতিরিক্ত প্রমাণীকরণ তথ্যের জন্য, onDocumentWrittenWithAuthContext ব্যবহার করুন।

পাইথন (প্রিভিউ)

from firebase_functions.firestore_fn import (
  on_document_written,
  Event,
  Change,
  DocumentSnapshot,
)

@on_document_written(document="users/{userId}")
def myfunction(event: Event[Change[DocumentSnapshot | None]]) -> None:
  # Get an object with the current document values.
  # If the document does not exist, it was deleted.
  document = (event.data.after.to_dict()
              if event.data.after is not None else None)

  # Get an object with the previous document values.
  # If the document does not exist, it was newly created.
  previous_values = (event.data.before.to_dict()
                     if event.data.before is not None else None)

  # Perform more operations ...

ডেটা পড়া এবং লেখা

যখন একটি ফাংশন ট্রিগার হয়, এটি ইভেন্ট সম্পর্কিত ডেটার একটি স্ন্যাপশট প্রদান করে। আপনি এই স্ন্যাপশটটি ইভেন্টটি ট্রিগারকারী ডকুমেন্ট থেকে পড়তে বা লিখতে বা আপনার ডাটাবেসের অন্যান্য অংশ অ্যাক্সেস করতে Firebase অ্যাডমিন SDK ব্যবহার করতে পারেন।

ইভেন্ট ডেটা

ডেটা পড়া

যখন একটি ফাংশন ট্রিগার করা হয়, আপনি আপডেট হওয়া একটি নথি থেকে ডেটা পেতে চাইতে পারেন, বা আপডেট করার আগে ডেটা পেতে পারেন৷ আপনি event.data.before ব্যবহার করে আগের ডেটা পেতে পারেন, যাতে আপডেটের আগে ডকুমেন্ট স্ন্যাপশট থাকে। একইভাবে, event.data.after আপডেটের পরে ডকুমেন্টের স্ন্যাপশট অবস্থা ধারণ করে।

Node.js

exports.updateuser2 = onDocumentUpdated("users/{userId}", (event) => {
    // Get an object with the current document values.
    // If the document does not exist, it was deleted
    const newValues =  event.data.after.data();

    // Get an object with the previous document values
    const previousValues =  event.data.before.data();
});

পাইথন (প্রিভিউ)

@on_document_updated(document="users/{userId}")
def myfunction(event: Event[Change[DocumentSnapshot]]) -> None:
  # Get an object with the current document values.
  new_value = event.data.after.to_dict()

  # Get an object with the previous document values.
  prev_value = event.data.before.to_dict()

আপনি অন্য কোন বস্তুর মত বৈশিষ্ট্য অ্যাক্সেস করতে পারেন। বিকল্পভাবে, আপনি নির্দিষ্ট ক্ষেত্র অ্যাক্সেস করতে get ফাংশন ব্যবহার করতে পারেন:

Node.js

// Fetch data using standard accessors
const age = event.data.after.data().age;
const name = event.data.after.data()['name'];

// Fetch data using built in accessor
const experience = event.data.after.data.get('experience');

পাইথন (প্রিভিউ)

# Get the value of a single document field.
age = event.data.after.get("age")

# Convert the document to a dictionary.
age = event.data.after.to_dict()["age"]

ডেটা লেখা

প্রতিটি ফাংশন আহ্বান আপনার ক্লাউড ফায়ারস্টোর ডাটাবেসের একটি নির্দিষ্ট নথির সাথে যুক্ত। আপনার ফাংশনে ফিরে আসা স্ন্যাপশটে আপনি সেই নথিটি অ্যাক্সেস করতে পারেন।

নথির রেফারেন্সে update() , set() , এবং remove() এর মত পদ্ধতি রয়েছে যাতে আপনি ফাংশনটি ট্রিগারকারী নথিটি সংশোধন করতে পারেন।

Node.js

import { onDocumentUpdated } from "firebase-functions/v2/firestore";

exports.countnamechanges = onDocumentUpdated('users/{userId}', (event) => {
  // Retrieve the current and previous value
  const data = event.data.after.data();
  const previousData = event.data.before.data();

  // We'll only update if the name has changed.
  // This is crucial to prevent infinite loops.
  if (data.name == previousData.name) {
    return null;
  }

  // Retrieve the current count of name changes
  let count = data.name_change_count;
  if (!count) {
    count = 0;
  }

  // Then return a promise of a set operation to update the count
  return data.after.ref.set({
    name_change_count: count + 1
  }, {merge: true});

});

পাইথন (প্রিভিউ)

@on_document_updated(document="users/{userId}")
def myfunction(event: Event[Change[DocumentSnapshot]]) -> None:
  # Get the current and previous document values.
  new_value = event.data.after
  prev_value = event.data.before

  # We'll only update if the name has changed.
  # This is crucial to prevent infinite loops.
  if new_value.get("name") == prev_value.get("name"):
      return

  # Retrieve the current count of name changes
  count = new_value.to_dict().get("name_change_count", 0)

  # Update the count
  new_value.reference.update({"name_change_count": count + 1})

ব্যবহারকারীর প্রমাণীকরণ তথ্য অ্যাক্সেস করুন

আপনি যদি নিম্নলিখিত ইভেন্টের ধরনগুলির মধ্যে একটি ব্যবহার করেন, আপনি ইভেন্টটি ট্রিগারকারী প্রধান সম্পর্কে ব্যবহারকারীর প্রমাণীকরণ তথ্য অ্যাক্সেস করতে পারেন। এই তথ্য বেস ইভেন্টে ফিরে তথ্য ছাড়াও.

Node.js

  • onDocumentCreatedWithAuthContext
  • onDocumentWrittenWithAuthContext
  • onDocumentDeletedWithAuthContext
  • onDocumentUpdatedWithAuthContext

পাইথন (প্রিভিউ)

  • on_document_created_with_auth_context
  • on_document_updated_with_auth_context
  • on_document_deleted_with_auth_context
  • on_document_written_with_auth_context

প্রমাণীকরণ প্রসঙ্গে উপলব্ধ ডেটা সম্পর্কে তথ্যের জন্য, প্রমাণীকরণ প্রসঙ্গ দেখুন। নিম্নলিখিত উদাহরণ প্রমাণীকরণ তথ্য পুনরুদ্ধার কিভাবে প্রদর্শন করে:

Node.js

import { onDocumentWrittenWithAuthContext } from "firebase-functions/v2/firestore"

exports.syncUser = onDocumentWrittenWithAuthContext("users/{userId}", (event) => {
    const snapshot = event.data.after;
    if (!snapshot) {
        console.log("No data associated with the event");
        return;
    }
    const data = snapshot.data();

    // retrieve auth context from event
    const { authType, authId } = event;

    let verified = false;
    if (authType === "system") {
      // system-generated users are automatically verified
      verified = true;
    } else if (authType === "unknown" || authType === "unauthenticated") {
      // admin users from a specific domain are verified
      if (authId.endsWith("@example.com")) {
        verified = true;
      }
    }

    return data.after.ref.set({
        created_by: authId,
        verified,
    }, {merge: true}); 
}); 

পাইথন (প্রিভিউ)

@on_document_updated_with_auth_context(document="users/{userId}")
def myfunction(event: Event[Change[DocumentSnapshot]]) -> None:

  # Get the current and previous document values.
  new_value = event.data.after
  prev_value = event.data.before

  # Get the auth context from the event
  user_auth_type = event.auth_type
  user_auth_id = event.auth_id

ট্রিগার ইভেন্টের বাইরের ডেটা

Cloud Functions একটি বিশ্বস্ত পরিবেশে সঞ্চালিত হয়। তারা আপনার প্রকল্পে একটি পরিষেবা অ্যাকাউন্ট হিসাবে অনুমোদিত, এবং আপনি Firebase অ্যাডমিন SDK ব্যবহার করে পড়া এবং লিখতে পারেন:

Node.js

const { initializeApp } = require('firebase-admin/app');
const { getFirestore, Timestamp, FieldValue } = require('firebase-admin/firestore');

initializeApp();
const db = getFirestore();

exports.writetofirestore = onDocumentWritten("some/doc", (event) => {
    db.doc('some/otherdoc').set({ ... });
  });

  exports.writetofirestore = onDocumentWritten('users/{userId}', (event) => {
    db.doc('some/otherdoc').set({
      // Update otherdoc
    });
  });

পাইথন (প্রিভিউ)

from firebase_admin import firestore, initialize_app
import google.cloud.firestore

initialize_app()

@on_document_written(document="some/doc")
def myfunction(event: Event[Change[DocumentSnapshot | None]]) -> None:
  firestore_client: google.cloud.firestore.Client = firestore.client()
  firestore_client.document("another/doc").set({
      # ...
  })

সীমাবদ্ধতা

Cloud Functions জন্য Cloud Firestore ট্রিগারগুলির জন্য নিম্নলিখিত সীমাবদ্ধতাগুলি নোট করুন:

  • Cloud Functions (1ম প্রজন্ম) Firestore নেটিভ মোডে একটি বিদ্যমান "(ডিফল্ট)" ডাটাবেসের পূর্বশর্ত। এটি Cloud Firestore নামের ডেটাবেস বা ডেটাস্টোর মোড সমর্থন করে না। অনুগ্রহ করে এই ধরনের ক্ষেত্রে ইভেন্ট কনফিগার করতে Cloud Functions (2nd gen) ব্যবহার করুন।
  • অর্ডার নিশ্চিত করা হয় না. দ্রুত পরিবর্তনগুলি একটি অপ্রত্যাশিত ক্রমে ফাংশন আহ্বানকে ট্রিগার করতে পারে।
  • ইভেন্টগুলি অন্তত একবার বিতরণ করা হয়, কিন্তু একটি একক ইভেন্ট একাধিক ফাংশন আহ্বানের ফলে হতে পারে। ঠিক-একবার মেকানিক্সের উপর নির্ভর করে এড়িয়ে চলুন এবং অদম্য ফাংশন লিখুন।
  • ডেটাস্টোর মোডে Cloud Firestore Cloud Functions (২য় প্রজন্ম) প্রয়োজন। Cloud Functions (1ম প্রজন্ম) ডেটাস্টোর মোড সমর্থন করে না।
  • একটি ট্রিগার একটি একক ডাটাবেসের সাথে যুক্ত। আপনি একাধিক ডাটাবেসের সাথে মেলে এমন একটি ট্রিগার তৈরি করতে পারবেন না।
  • একটি ডাটাবেস মুছে দিলে সেই ডাটাবেসের জন্য কোনো ট্রিগার স্বয়ংক্রিয়ভাবে মুছে যায় না। ট্রিগারটি ইভেন্টগুলি সরবরাহ করা বন্ধ করে তবে আপনি ট্রিগারটি মুছে না দেওয়া পর্যন্ত বিদ্যমান থাকবে৷
  • যদি একটি মিলে যাওয়া ইভেন্ট সর্বোচ্চ অনুরোধের আকারকে অতিক্রম করে, তাহলে ইভেন্টটি Cloud Functions (প্রথম প্রজন্ম) বিতরণ করা যাবে না।
    • অনুরোধের আকারের কারণে ইভেন্টগুলি বিতরণ করা হয়নি প্ল্যাটফর্ম লগগুলিতে লগ ইন করা হয় এবং প্রকল্পের জন্য লগ ব্যবহারের জন্য গণনা করা হয়৷
    • আপনি লগ এক্সপ্লোরার-এ এই লগগুলি খুঁজে পেতে পারেন error তীব্রতার "প্রথম প্রজন্মের সীমা অতিক্রম করার কারণে ইভেন্টটি ক্লাউড ফাংশনে বিতরণ করতে পারে না..."। আপনি functionName ক্ষেত্রের অধীনে ফাংশনের নাম খুঁজে পেতে পারেন। receiveTimestamp ক্ষেত্রটি এখন থেকে এক ঘন্টার মধ্যে থাকলে, আপনি টাইমস্ট্যাম্পের আগে এবং পরে একটি স্ন্যাপশট সহ প্রশ্নে থাকা নথিটি পড়ে প্রকৃত ইভেন্ট বিষয়বস্তু অনুমান করতে পারেন।
    • এই ধরনের ক্যাডেন্স এড়াতে, আপনি করতে পারেন:
      • মাইগ্রেট করুন এবং Cloud Functions আপগ্রেড করুন (২য় প্রজন্ম)
      • ডকুমেন্টটি ছোট করুন
      • প্রশ্নে থাকা Cloud Functions মুছুন
    • আপনি বর্জন ব্যবহার করে নিজেই লগিং বন্ধ করতে পারেন তবে মনে রাখবেন যে আপত্তিকর ঘটনাগুলি এখনও বিতরণ করা হবে না৷
,


Cloud Functions সাহায্যে, আপনি ক্লাউড ফায়ারস্টোরে ক্লায়েন্ট কোড আপডেট করার প্রয়োজন ছাড়াই ইভেন্টগুলি পরিচালনা করতে পারেন৷ আপনি ডকুমেন্ট স্ন্যাপশট ইন্টারফেসের মাধ্যমে বা অ্যাডমিন SDK-এর মাধ্যমে ক্লাউড ফায়ারস্টোর পরিবর্তন করতে পারেন।

একটি সাধারণ জীবনচক্রে, একটি ক্লাউড ফায়ারস্টোর ফাংশন নিম্নলিখিতগুলি করে:

  1. একটি নির্দিষ্ট নথিতে পরিবর্তনের জন্য অপেক্ষা করে।
  2. একটি ঘটনা ঘটলে ট্রিগার করে এবং তার কার্য সম্পাদন করে।
  3. নির্দিষ্ট নথিতে সংরক্ষিত ডেটার একটি স্ন্যাপশট ধারণ করে এমন একটি ডেটা অবজেক্ট গ্রহণ করে। ইভেন্টগুলি লিখতে বা আপডেট করার জন্য, ডেটা অবজেক্টে দুটি স্ন্যাপশট থাকে যা ট্রিগারিং ইভেন্টের আগে এবং পরে ডেটার অবস্থা উপস্থাপন করে।

ফায়ারস্টোর ইনস্ট্যান্সের অবস্থান এবং ফাংশনের অবস্থানের মধ্যে দূরত্ব উল্লেখযোগ্য নেটওয়ার্ক লেটেন্সি তৈরি করতে পারে। কর্মক্ষমতা অপ্টিমাইজ করতে, যেখানে প্রযোজ্য সেখানে ফাংশন অবস্থান নির্দিষ্ট করার কথা বিবেচনা করুন।

ক্লাউড ফায়ারস্টোর ফাংশন ট্রিগার করে

Cloud Functions for Firebase নিম্নলিখিত ক্লাউড ফায়ারস্টোর ইভেন্ট ট্রিগারগুলি রপ্তানি করে যাতে আপনি নির্দিষ্ট ক্লাউড ফায়ারস্টোর ইভেন্টের সাথে আবদ্ধ হ্যান্ডলার তৈরি করতে পারেন:

Node.js

ইভেন্টের ধরন ট্রিগার
onDocumentCreated যখন একটি নথিতে প্রথমবার লেখা হয় তখন ট্রিগার হয়৷
onDocumentUpdated ট্রিগার হয় যখন একটি ডকুমেন্ট আগে থেকেই থাকে এবং কোনো মান পরিবর্তন হয়।
onDocumentDeleted একটি নথি মুছে ফেলা হলে ট্রিগার হয়।
onDocumentWritten onDocumentCreated , onDocumentUpdated বা onDocumentDeleted ট্রিগার হলে ট্রিগার হয়।
onDocumentCreatedWithAuthContext onDocumentCreated অতিরিক্ত প্রমাণীকরণ তথ্য সহ
onDocumentWrittenWithAuthContext অতিরিক্ত প্রমাণীকরণ তথ্য সহ onDocumentWritten
onDocumentDeletedWithAuthContext onDocumentDeleted অতিরিক্ত প্রমাণীকরণ তথ্য সহ মুছে ফেলা হয়েছে
onDocumentUpdatedWithAuthContext অতিরিক্ত প্রমাণীকরণ তথ্য সহ onDocumentUpdated

পাইথন (প্রিভিউ)

ইভেন্টের ধরন ট্রিগার
on_document_created যখন একটি নথিতে প্রথমবার লেখা হয় তখন ট্রিগার হয়৷
on_document_updated ট্রিগার হয় যখন একটি ডকুমেন্ট আগে থেকেই থাকে এবং কোনো মান পরিবর্তন হয়।
on_document_deleted একটি নথি মুছে ফেলা হলে ট্রিগার হয়।
on_document_written on_document_created , on_document_updated বা on_document_deleted ট্রিগার হলে ট্রিগার হয়।
on_document_created_with_auth_context অতিরিক্ত প্রমাণীকরণ তথ্য সহ on_document_created
on_document_updated_with_auth_context অতিরিক্ত প্রমাণীকরণ তথ্য সহ on_document_updated
on_document_deleted_with_auth_context অতিরিক্ত প্রমাণীকরণ তথ্য সহ on_document_deleted
on_document_written_with_auth_context অতিরিক্ত প্রমাণীকরণ তথ্য সহ on_document_written

ক্লাউড ফায়ারস্টোর ইভেন্টগুলি শুধুমাত্র ডকুমেন্ট পরিবর্তনের উপর ট্রিগার করে। একটি ক্লাউড ফায়ারস্টোর নথিতে একটি আপডেট যেখানে ডেটা অপরিবর্তিত থাকে (একটি নো-অপ লেখা) একটি আপডেট বা লেখার ইভেন্ট তৈরি করে না। নির্দিষ্ট ক্ষেত্রে ইভেন্ট যোগ করা সম্ভব নয়।

আপনার যদি এখনও Cloud Functions for Firebase জন্য কোনও প্রকল্প সক্রিয় না থাকে, তাহলে Cloud Functions for Firebase কনফিগার এবং সেট আপ করতে Cloud Functions for Firebase দিয়ে শুরু করুন পড়ুন৷

ক্লাউড ফায়ারস্টোর-ট্রিগার করা ফাংশন লেখা

একটি ফাংশন ট্রিগার সংজ্ঞায়িত করুন

একটি ক্লাউড ফায়ারস্টোর ট্রিগার সংজ্ঞায়িত করতে, একটি নথির পথ এবং একটি ইভেন্টের ধরন নির্দিষ্ট করুন:

Node.js

import {
  onDocumentWritten,
  onDocumentCreated,
  onDocumentUpdated,
  onDocumentDeleted,
  Change,
  FirestoreEvent
} from "firebase-functions/v2/firestore";

exports.myfunction = onDocumentWritten("my-collection/{docId}", (event) => {
   /* ... */ 
});

পাইথন (প্রিভিউ)

from firebase_functions.firestore_fn import (
  on_document_created,
  on_document_deleted,
  on_document_updated,
  on_document_written,
  Event,
  Change,
  DocumentSnapshot,
)

@on_document_created(document="users/{userId}")
def myfunction(event: Event[DocumentSnapshot]) -> None:

নথির পাথগুলি একটি নির্দিষ্ট নথি বা একটি ওয়াইল্ডকার্ড প্যাটার্ন উল্লেখ করতে পারে।

একটি একক নথি উল্লেখ করুন

আপনি যদি একটি নির্দিষ্ট নথিতে কোনও পরিবর্তনের জন্য একটি ইভেন্ট ট্রিগার করতে চান তবে আপনি নিম্নলিখিত ফাংশনটি ব্যবহার করতে পারেন।

Node.js

import {
  onDocumentWritten,
  Change,
  FirestoreEvent
} from "firebase-functions/v2/firestore";

exports.myfunction = onDocumentWritten("users/marie", (event) => {
  // Your code here
});

পাইথন (প্রিভিউ)

from firebase_functions.firestore_fn import (
  on_document_written,
  Event,
  Change,
  DocumentSnapshot,
)

@on_document_written(document="users/marie")
def myfunction(event: Event[Change[DocumentSnapshot]]) -> None:

ওয়াইল্ডকার্ড ব্যবহার করে নথির একটি গ্রুপ নির্দিষ্ট করুন

আপনি যদি নথির একটি গোষ্ঠীতে একটি ট্রিগার সংযুক্ত করতে চান, যেমন একটি নির্দিষ্ট সংগ্রহের কোনো নথি, তাহলে নথি আইডির জায়গায় একটি {wildcard} ব্যবহার করুন:

Node.js

import {
  onDocumentWritten,
  Change,
  FirestoreEvent
} from "firebase-functions/v2/firestore";

exports.myfunction = onDocumentWritten("users/{userId}", (event) => {
  // If we set `/users/marie` to {name: "Marie"} then
  // event.params.userId == "marie"
  // ... and ...
  // event.data.after.data() == {name: "Marie"}
});

পাইথন (প্রিভিউ)

from firebase_functions.firestore_fn import (
  on_document_written,
  Event,
  Change,
  DocumentSnapshot,
)

@on_document_written(document="users/{userId}")
def myfunction(event: Event[Change[DocumentSnapshot]]) -> None:
  # If we set `/users/marie` to {name: "Marie"} then
  event.params["userId"] == "marie"  # True
  # ... and ...
  event.data.after.to_dict() == {"name": "Marie"}  # True

এই উদাহরণে, যখন users কোনো নথিতে কোনো ক্ষেত্র পরিবর্তন করা হয়, তখন এটি userId নামক ওয়াইল্ডকার্ডের সাথে মেলে।

যদি users মধ্যে একটি নথিতে উপসংগ্রহ থাকে এবং সেই উপসংগ্রহগুলির নথিগুলির একটিতে একটি ক্ষেত্র পরিবর্তন করা হয়, তাহলে userId ওয়াইল্ডকার্ডটি ট্রিগার হয় না

ওয়াইল্ডকার্ড ম্যাচ ডকুমেন্ট পাথ থেকে বের করে event.params এ সংরক্ষণ করা হয়। আপনি সুস্পষ্ট সংগ্রহ বা নথি আইডি প্রতিস্থাপন করতে চান যতগুলি ওয়াইল্ডকার্ড সংজ্ঞায়িত করতে পারেন, উদাহরণস্বরূপ:

Node.js

import {
  onDocumentWritten,
  Change,
  FirestoreEvent
} from "firebase-functions/v2/firestore";

exports.myfunction = onDocumentWritten("users/{userId}/{messageCollectionId}/{messageId}", (event) => {
    // If we set `/users/marie/incoming_messages/134` to {body: "Hello"} then
    // event.params.userId == "marie";
    // event.params.messageCollectionId == "incoming_messages";
    // event.params.messageId == "134";
    // ... and ...
    // event.data.after.data() == {body: "Hello"}
});

পাইথন (প্রিভিউ)

from firebase_functions.firestore_fn import (
  on_document_written,
  Event,
  Change,
  DocumentSnapshot,
)

@on_document_written(document="users/{userId}/{messageCollectionId}/{messageId}")
def myfunction(event: Event[Change[DocumentSnapshot]]) -> None:
  # If we set `/users/marie/incoming_messages/134` to {body: "Hello"} then
  event.params["userId"] == "marie"  # True
  event.params["messageCollectionId"] == "incoming_messages"  # True
  event.params["messageId"] == "134"  # True
  # ... and ...
  event.data.after.to_dict() == {"body": "Hello"}

আপনার ট্রিগার অবশ্যই একটি নথির দিকে নির্দেশ করবে, এমনকি আপনি যদি একটি ওয়াইল্ডকার্ড ব্যবহার করেন। উদাহরণস্বরূপ, users/{userId}/{messageCollectionId} বৈধ নয় কারণ {messageCollectionId} একটি সংগ্রহ। যাইহোক, users/{userId}/{messageCollectionId}/{messageId} বৈধ কারণ {messageId} সর্বদা একটি নথিতে নির্দেশ করবে৷

ইভেন্ট ট্রিগার

একটি নতুন নথি তৈরি করা হলে একটি ফাংশন ট্রিগার করুন

সংগ্রহে একটি নতুন নথি তৈরি করা হলে আপনি যে কোনো সময় ফায়ার করার জন্য একটি ফাংশন ট্রিগার করতে পারেন। এই উদাহরণ ফাংশন প্রতিবার একটি নতুন ব্যবহারকারী প্রোফাইল যোগ করা হলে ট্রিগার করে:

Node.js

import {
  onDocumentCreated,
  Change,
  FirestoreEvent
} from "firebase-functions/v2/firestore";

exports.createuser = onDocumentCreated("users/{userId}", (event) => {
    // Get an object representing the document
    // e.g. {'name': 'Marie', 'age': 66}
    const snapshot = event.data;
    if (!snapshot) {
        console.log("No data associated with the event");
        return;
    }
    const data = snapshot.data();

    // access a particular field as you would any JS property
    const name = data.name;

    // perform more operations ...
});

অতিরিক্ত প্রমাণীকরণ তথ্যের জন্য, onDocumentCreatedWithAuthContext ব্যবহার করুন।

পাইথন (প্রিভিউ)

from firebase_functions.firestore_fn import (
  on_document_created,
  Event,
  DocumentSnapshot,
)

@on_document_created(document="users/{userId}")
def myfunction(event: Event[DocumentSnapshot]) -> None:
  # Get a dictionary representing the document
  # e.g. {'name': 'Marie', 'age': 66}
  new_value = event.data.to_dict()

  # Access a particular field as you would any dictionary
  name = new_value["name"]

  # Perform more operations ...

একটি নথি আপডেট করা হলে একটি ফাংশন ট্রিগার করুন

একটি নথি আপডেট করা হলে আপনি ফায়ার করার জন্য একটি ফাংশন ট্রিগার করতে পারেন। এই উদাহরণ ফাংশন ফায়ার করে যদি একজন ব্যবহারকারী তাদের প্রোফাইল পরিবর্তন করে:

Node.js

import {
  onDocumentUpdated,
  Change,
  FirestoreEvent
} from "firebase-functions/v2/firestore";

exports.updateuser = onDocumentUpdated("users/{userId}", (event) => {
    // Get an object representing the document
    // e.g. {'name': 'Marie', 'age': 66}
    const newValue = event.data.after.data();

    // access a particular field as you would any JS property
    const name = newValue.name;

    // perform more operations ...
});

অতিরিক্ত প্রমাণীকরণ তথ্যের জন্য, onDocumentUpdatedWithAuthContext ব্যবহার করুন।

পাইথন (প্রিভিউ)

from firebase_functions.firestore_fn import (
  on_document_updated,
  Event,
  Change,
  DocumentSnapshot,
)

@on_document_updated(document="users/{userId}")
def myfunction(event: Event[Change[DocumentSnapshot]]) -> None:
  # Get a dictionary representing the document
  # e.g. {'name': 'Marie', 'age': 66}
  new_value = event.data.after.to_dict()

  # Access a particular field as you would any dictionary
  name = new_value["name"]

  # Perform more operations ...

একটি নথি মুছে ফেলা হলে একটি ফাংশন ট্রিগার

একটি নথি মুছে ফেলা হলে আপনি একটি ফাংশন ট্রিগার করতে পারেন। এই উদাহরণ ফাংশন ফায়ার করে যখন একজন ব্যবহারকারী তাদের ব্যবহারকারী প্রোফাইল মুছে দেয়:

Node.js

import {
  onDocumentDeleted,
  Change,
  FirestoreEvent
} from "firebase-functions/v2/firestore";

exports.deleteuser = onDocumentDeleted("users/{userId}", (event) => {
    // Get an object representing the document
    // e.g. {'name': 'Marie', 'age': 66}
    const snap =  event.data;
    const data =  snap.data();

    // perform more operations ...
});

অতিরিক্ত প্রমাণীকরণ তথ্যের জন্য, onDocumentDeletedWithAuthContext ব্যবহার করুন।

পাইথন (প্রিভিউ)

from firebase_functions.firestore_fn import (
  on_document_deleted,
  Event,
  DocumentSnapshot,
)

@on_document_deleted(document="users/{userId}")
def myfunction(event: Event[DocumentSnapshot|None]) -> None:
  # Perform more operations ...

একটি নথিতে সমস্ত পরিবর্তনের জন্য একটি ফাংশন ট্রিগার করুন

আপনি যদি ইভেন্টের ধরণ সম্পর্কে চিন্তা না করেন তবে আপনি "ডকুমেন্ট লিখিত" ইভেন্ট ট্রিগার ব্যবহার করে একটি ক্লাউড ফায়ারস্টোর নথিতে সমস্ত পরিবর্তন শুনতে পারেন৷ এই উদাহরণ ফাংশনটি চালু হয় যদি একজন ব্যবহারকারী তৈরি করা হয়, আপডেট করা হয় বা মুছে ফেলা হয়:

Node.js

import {
  onDocumentWritten,
  Change,
  FirestoreEvent
} from "firebase-functions/v2/firestore";

exports.modifyuser = onDocumentWritten("users/{userId}", (event) => {
    // Get an object with the current document values.
    // If the document does not exist, it was deleted
    const document =  event.data.after.data();

    // Get an object with the previous document values
    const previousValues =  event.data.before.data();

    // perform more operations ...
});

অতিরিক্ত প্রমাণীকরণ তথ্যের জন্য, onDocumentWrittenWithAuthContext ব্যবহার করুন।

পাইথন (প্রিভিউ)

from firebase_functions.firestore_fn import (
  on_document_written,
  Event,
  Change,
  DocumentSnapshot,
)

@on_document_written(document="users/{userId}")
def myfunction(event: Event[Change[DocumentSnapshot | None]]) -> None:
  # Get an object with the current document values.
  # If the document does not exist, it was deleted.
  document = (event.data.after.to_dict()
              if event.data.after is not None else None)

  # Get an object with the previous document values.
  # If the document does not exist, it was newly created.
  previous_values = (event.data.before.to_dict()
                     if event.data.before is not None else None)

  # Perform more operations ...

ডেটা পড়া এবং লেখা

যখন একটি ফাংশন ট্রিগার হয়, এটি ইভেন্ট সম্পর্কিত ডেটার একটি স্ন্যাপশট প্রদান করে। আপনি এই স্ন্যাপশটটি ইভেন্টটি ট্রিগারকারী ডকুমেন্ট থেকে পড়তে বা লিখতে বা আপনার ডাটাবেসের অন্যান্য অংশ অ্যাক্সেস করতে Firebase অ্যাডমিন SDK ব্যবহার করতে পারেন।

ইভেন্ট ডেটা

ডেটা পড়া

যখন একটি ফাংশন ট্রিগার করা হয়, আপনি আপডেট হওয়া একটি নথি থেকে ডেটা পেতে চাইতে পারেন, বা আপডেট করার আগে ডেটা পেতে পারেন৷ আপনি event.data.before ব্যবহার করে আগের ডেটা পেতে পারেন, যাতে আপডেটের আগে ডকুমেন্ট স্ন্যাপশট থাকে। একইভাবে, event.data.after আপডেটের পরে ডকুমেন্টের স্ন্যাপশট অবস্থা ধারণ করে।

Node.js

exports.updateuser2 = onDocumentUpdated("users/{userId}", (event) => {
    // Get an object with the current document values.
    // If the document does not exist, it was deleted
    const newValues =  event.data.after.data();

    // Get an object with the previous document values
    const previousValues =  event.data.before.data();
});

পাইথন (প্রিভিউ)

@on_document_updated(document="users/{userId}")
def myfunction(event: Event[Change[DocumentSnapshot]]) -> None:
  # Get an object with the current document values.
  new_value = event.data.after.to_dict()

  # Get an object with the previous document values.
  prev_value = event.data.before.to_dict()

আপনি অন্য কোন বস্তুর মত বৈশিষ্ট্য অ্যাক্সেস করতে পারেন। বিকল্পভাবে, আপনি নির্দিষ্ট ক্ষেত্র অ্যাক্সেস করতে get ফাংশন ব্যবহার করতে পারেন:

Node.js

// Fetch data using standard accessors
const age = event.data.after.data().age;
const name = event.data.after.data()['name'];

// Fetch data using built in accessor
const experience = event.data.after.data.get('experience');

পাইথন (প্রিভিউ)

# Get the value of a single document field.
age = event.data.after.get("age")

# Convert the document to a dictionary.
age = event.data.after.to_dict()["age"]

ডেটা লেখা

প্রতিটি ফাংশন আহ্বান আপনার ক্লাউড ফায়ারস্টোর ডাটাবেসের একটি নির্দিষ্ট নথির সাথে যুক্ত। আপনার ফাংশনে ফিরে আসা স্ন্যাপশটে আপনি সেই নথিটি অ্যাক্সেস করতে পারেন।

নথির রেফারেন্সে update() , set() , এবং remove() এর মত পদ্ধতি রয়েছে যাতে আপনি ফাংশনটি ট্রিগারকারী নথিটি সংশোধন করতে পারেন।

Node.js

import { onDocumentUpdated } from "firebase-functions/v2/firestore";

exports.countnamechanges = onDocumentUpdated('users/{userId}', (event) => {
  // Retrieve the current and previous value
  const data = event.data.after.data();
  const previousData = event.data.before.data();

  // We'll only update if the name has changed.
  // This is crucial to prevent infinite loops.
  if (data.name == previousData.name) {
    return null;
  }

  // Retrieve the current count of name changes
  let count = data.name_change_count;
  if (!count) {
    count = 0;
  }

  // Then return a promise of a set operation to update the count
  return data.after.ref.set({
    name_change_count: count + 1
  }, {merge: true});

});

পাইথন (প্রিভিউ)

@on_document_updated(document="users/{userId}")
def myfunction(event: Event[Change[DocumentSnapshot]]) -> None:
  # Get the current and previous document values.
  new_value = event.data.after
  prev_value = event.data.before

  # We'll only update if the name has changed.
  # This is crucial to prevent infinite loops.
  if new_value.get("name") == prev_value.get("name"):
      return

  # Retrieve the current count of name changes
  count = new_value.to_dict().get("name_change_count", 0)

  # Update the count
  new_value.reference.update({"name_change_count": count + 1})

ব্যবহারকারীর প্রমাণীকরণ তথ্য অ্যাক্সেস করুন

আপনি যদি নিম্নলিখিত ইভেন্টের ধরনগুলির মধ্যে একটি ব্যবহার করেন, আপনি ইভেন্টটি ট্রিগারকারী প্রধান সম্পর্কে ব্যবহারকারীর প্রমাণীকরণ তথ্য অ্যাক্সেস করতে পারেন। এই তথ্য বেস ইভেন্টে ফিরে তথ্য ছাড়াও.

Node.js

  • onDocumentCreatedWithAuthContext
  • onDocumentWrittenWithAuthContext
  • onDocumentDeletedWithAuthContext
  • onDocumentUpdatedWithAuthContext

পাইথন (প্রিভিউ)

  • on_document_created_with_auth_context
  • on_document_updated_with_auth_context
  • on_document_deleted_with_auth_context
  • on_document_written_with_auth_context

প্রমাণীকরণ প্রসঙ্গে উপলব্ধ ডেটা সম্পর্কে তথ্যের জন্য, প্রমাণীকরণ প্রসঙ্গ দেখুন। নিম্নলিখিত উদাহরণ প্রমাণীকরণ তথ্য পুনরুদ্ধার কিভাবে প্রদর্শন করে:

Node.js

import { onDocumentWrittenWithAuthContext } from "firebase-functions/v2/firestore"

exports.syncUser = onDocumentWrittenWithAuthContext("users/{userId}", (event) => {
    const snapshot = event.data.after;
    if (!snapshot) {
        console.log("No data associated with the event");
        return;
    }
    const data = snapshot.data();

    // retrieve auth context from event
    const { authType, authId } = event;

    let verified = false;
    if (authType === "system") {
      // system-generated users are automatically verified
      verified = true;
    } else if (authType === "unknown" || authType === "unauthenticated") {
      // admin users from a specific domain are verified
      if (authId.endsWith("@example.com")) {
        verified = true;
      }
    }

    return data.after.ref.set({
        created_by: authId,
        verified,
    }, {merge: true}); 
}); 

পাইথন (প্রিভিউ)

@on_document_updated_with_auth_context(document="users/{userId}")
def myfunction(event: Event[Change[DocumentSnapshot]]) -> None:

  # Get the current and previous document values.
  new_value = event.data.after
  prev_value = event.data.before

  # Get the auth context from the event
  user_auth_type = event.auth_type
  user_auth_id = event.auth_id

ট্রিগার ইভেন্টের বাইরের ডেটা

Cloud Functions একটি বিশ্বস্ত পরিবেশে সঞ্চালিত হয়। তারা আপনার প্রকল্পে একটি পরিষেবা অ্যাকাউন্ট হিসাবে অনুমোদিত, এবং আপনি Firebase অ্যাডমিন SDK ব্যবহার করে পড়া এবং লিখতে পারেন:

Node.js

const { initializeApp } = require('firebase-admin/app');
const { getFirestore, Timestamp, FieldValue } = require('firebase-admin/firestore');

initializeApp();
const db = getFirestore();

exports.writetofirestore = onDocumentWritten("some/doc", (event) => {
    db.doc('some/otherdoc').set({ ... });
  });

  exports.writetofirestore = onDocumentWritten('users/{userId}', (event) => {
    db.doc('some/otherdoc').set({
      // Update otherdoc
    });
  });

পাইথন (প্রিভিউ)

from firebase_admin import firestore, initialize_app
import google.cloud.firestore

initialize_app()

@on_document_written(document="some/doc")
def myfunction(event: Event[Change[DocumentSnapshot | None]]) -> None:
  firestore_client: google.cloud.firestore.Client = firestore.client()
  firestore_client.document("another/doc").set({
      # ...
  })

সীমাবদ্ধতা

Cloud Functions জন্য Cloud Firestore ট্রিগারগুলির জন্য নিম্নলিখিত সীমাবদ্ধতাগুলি নোট করুন:

  • Cloud Functions (1ম প্রজন্ম) Firestore নেটিভ মোডে একটি বিদ্যমান "(ডিফল্ট)" ডাটাবেসের পূর্বশর্ত। এটি Cloud Firestore নামের ডেটাবেস বা ডেটাস্টোর মোড সমর্থন করে না। অনুগ্রহ করে এই ধরনের ক্ষেত্রে ইভেন্ট কনফিগার করতে Cloud Functions (2nd gen) ব্যবহার করুন।
  • অর্ডার নিশ্চিত করা হয় না. দ্রুত পরিবর্তনগুলি একটি অপ্রত্যাশিত ক্রমে ফাংশন আহ্বানকে ট্রিগার করতে পারে।
  • ইভেন্টগুলি অন্তত একবার বিতরণ করা হয়, কিন্তু একটি একক ইভেন্ট একাধিক ফাংশন আহ্বানের ফলে হতে পারে। ঠিক-একবার মেকানিক্সের উপর নির্ভর করে এড়িয়ে চলুন এবং অদম্য ফাংশন লিখুন।
  • ডেটাস্টোর মোডে Cloud Firestore Cloud Functions (২য় প্রজন্ম) প্রয়োজন। Cloud Functions (1ম প্রজন্ম) ডেটাস্টোর মোড সমর্থন করে না।
  • একটি ট্রিগার একটি একক ডাটাবেসের সাথে যুক্ত। আপনি একাধিক ডাটাবেসের সাথে মেলে এমন একটি ট্রিগার তৈরি করতে পারবেন না।
  • একটি ডাটাবেস মুছে দিলে সেই ডাটাবেসের জন্য কোনো ট্রিগার স্বয়ংক্রিয়ভাবে মুছে যায় না। ট্রিগারটি ইভেন্টগুলি সরবরাহ করা বন্ধ করে তবে আপনি ট্রিগারটি মুছে না দেওয়া পর্যন্ত বিদ্যমান থাকবে৷
  • যদি একটি মিলে যাওয়া ইভেন্ট সর্বোচ্চ অনুরোধের আকারকে অতিক্রম করে, তাহলে ইভেন্টটি Cloud Functions (প্রথম প্রজন্ম) বিতরণ করা যাবে না।
    • অনুরোধের আকারের কারণে ইভেন্টগুলি বিতরণ করা হয়নি প্ল্যাটফর্ম লগগুলিতে লগ ইন করা হয় এবং প্রকল্পের জন্য লগ ব্যবহারের জন্য গণনা করা হয়৷
    • আপনি লগ এক্সপ্লোরার-এ এই লগগুলি খুঁজে পেতে পারেন error তীব্রতার "প্রথম প্রজন্মের সীমা অতিক্রম করার কারণে ইভেন্টটি ক্লাউড ফাংশনে বিতরণ করতে পারে না..."। আপনি functionName ক্ষেত্রের অধীনে ফাংশনের নাম খুঁজে পেতে পারেন। receiveTimestamp ক্ষেত্রটি এখন থেকে এক ঘন্টার মধ্যে থাকলে, আপনি টাইমস্ট্যাম্পের আগে এবং পরে একটি স্ন্যাপশট সহ প্রশ্নে থাকা নথিটি পড়ে প্রকৃত ইভেন্ট বিষয়বস্তু অনুমান করতে পারেন।
    • এই ধরনের ক্যাডেন্স এড়াতে, আপনি করতে পারেন:
      • মাইগ্রেট করুন এবং Cloud Functions আপগ্রেড করুন (২য় প্রজন্ম)
      • ডকুমেন্টটি ছোট করুন
      • প্রশ্নে থাকা Cloud Functions মুছুন
    • আপনি বর্জন ব্যবহার করে নিজেই লগিং বন্ধ করতে পারেন তবে মনে রাখবেন যে আপত্তিকর ঘটনাগুলি এখনও বিতরণ করা হবে না৷
,


Cloud Functions সাথে, আপনি ক্লাউড ফায়ারস্টোরের ইভেন্টগুলি ক্লায়েন্ট কোড আপডেট করার প্রয়োজন ছাড়াই পরিচালনা করতে পারেন। আপনি ডকুমেন্ট স্ন্যাপশট ইন্টারফেসের মাধ্যমে বা অ্যাডমিন এসডিকে এর মাধ্যমে ক্লাউড ফায়ারস্টোর পরিবর্তন করতে পারেন।

একটি সাধারণ লাইফসাইকেলে, একটি ক্লাউড ফায়ারস্টোর ফাংশন নিম্নলিখিতগুলি করে:

  1. একটি নির্দিষ্ট নথিতে পরিবর্তনের জন্য অপেক্ষা করে।
  2. একটি ঘটনা ঘটলে ট্রিগার করে এবং তার কার্য সম্পাদন করে।
  3. নির্দিষ্ট নথিতে সংরক্ষিত ডেটার একটি স্ন্যাপশট ধারণ করে এমন একটি ডেটা অবজেক্ট গ্রহণ করে। ইভেন্টগুলি লিখুন বা আপডেট করার জন্য, ডেটা অবজেক্টে দুটি স্ন্যাপশট রয়েছে যা ট্রিগার ইভেন্টের আগে এবং পরে ডেটা স্টেটের প্রতিনিধিত্ব করে।

ফায়ারস্টোর উদাহরণের অবস্থান এবং ফাংশনের অবস্থানের মধ্যে দূরত্ব উল্লেখযোগ্য নেটওয়ার্কের বিলম্ব তৈরি করতে পারে। কর্মক্ষমতা অনুকূল করতে, প্রযোজ্য যেখানে ফাংশন অবস্থান নির্দিষ্ট করে বিবেচনা করুন।

ক্লাউড ফায়ারস্টোর ফাংশন ট্রিগার

Cloud Functions for Firebase নিম্নলিখিত ক্লাউড ফায়ারস্টোর ইভেন্ট ট্রিগারগুলি রফতানি করে যাতে আপনাকে নির্দিষ্ট ক্লাউড ফায়ারস্টোর ইভেন্টগুলির সাথে আবদ্ধ হ্যান্ডলারগুলি তৈরি করতে দেয়:

Node.js

ইভেন্টের ধরন ট্রিগার
onDocumentCreated প্রথমবারের মতো কোনও নথি লেখা থাকলে ট্রিগার করা হয়েছে।
onDocumentUpdated ট্রিগার করা হয়েছে যখন কোনও ডকুমেন্ট ইতিমধ্যে বিদ্যমান এবং এর কোনও মান পরিবর্তিত হয়।
onDocumentDeleted কোনও দস্তাবেজ মুছে ফেলা হলে ট্রিগার করা হয়েছে।
onDocumentWritten ট্রিগার করা হয় যখন onDocumentCreated , onDocumentUpdated বা onDocumentDeleted ট্রিগার হয়।
onDocumentCreatedWithAuthContext অতিরিক্ত প্রমাণীকরণের তথ্য সহ onDocumentCreated
onDocumentWrittenWithAuthContext অতিরিক্ত প্রমাণীকরণের তথ্য সহ onDocumentWritten
onDocumentDeletedWithAuthContext অতিরিক্ত প্রমাণীকরণের তথ্য সহ onDocumentDeleted
onDocumentUpdatedWithAuthContext অতিরিক্ত প্রমাণীকরণের তথ্য সহ onDocumentUpdated

পাইথন (প্রিভিউ)

ইভেন্টের ধরন ট্রিগার
on_document_created প্রথমবারের মতো কোনও নথি লেখা থাকলে ট্রিগার করা হয়েছে।
on_document_updated ট্রিগার করা হয়েছে যখন কোনও ডকুমেন্ট ইতিমধ্যে বিদ্যমান এবং এর কোনও মান পরিবর্তিত হয়।
on_document_deleted কোনও দস্তাবেজ মুছে ফেলা হলে ট্রিগার করা হয়েছে।
on_document_written ট্রিগার করা যখন on_document_created , on_document_updated বা on_document_deleted ট্রিগার হয়।
on_document_created_with_auth_context অতিরিক্ত প্রমাণীকরণের তথ্যের সাথে on_document_created
on_document_updated_with_auth_context অতিরিক্ত প্রমাণীকরণের তথ্যের সাথে on_document_updated
on_document_deleted_with_auth_context অতিরিক্ত প্রমাণীকরণের তথ্যের সাথে on_document_deleted
on_document_written_with_auth_context অতিরিক্ত প্রমাণীকরণের তথ্য সহ on_document_written

ক্লাউড ফায়ারস্টোর ইভেন্টগুলি কেবল ডকুমেন্টের পরিবর্তনে ট্রিগার করে। ক্লাউড ফায়ারস্টোর ডকুমেন্টের আপডেট যেখানে ডেটা অপরিবর্তিত রয়েছে (একটি নো-ওপ রাইট) কোনও আপডেট বা লেখার ইভেন্ট তৈরি করে না। নির্দিষ্ট ক্ষেত্রে ইভেন্টগুলি যুক্ত করা সম্ভব নয়।

যদি আপনার কাছে এখনও Cloud Functions for Firebase জন্য কোনও প্রকল্প সক্ষম না থাকে তবে Cloud Functions for Firebase কনফিগার করতে এবং সেট আপ করতে Cloud Functions for Firebase দিয়ে শুরু করুন

ক্লাউড ফায়ারস্টোর-ট্রিগার ফাংশন লেখা

একটি ফাংশন ট্রিগার সংজ্ঞায়িত করুন

একটি ক্লাউড ফায়ারস্টোর ট্রিগার সংজ্ঞায়িত করতে, একটি ডকুমেন্ট পাথ এবং একটি ইভেন্টের ধরণ নির্দিষ্ট করুন:

Node.js

import {
  onDocumentWritten,
  onDocumentCreated,
  onDocumentUpdated,
  onDocumentDeleted,
  Change,
  FirestoreEvent
} from "firebase-functions/v2/firestore";

exports.myfunction = onDocumentWritten("my-collection/{docId}", (event) => {
   /* ... */ 
});

পাইথন (প্রিভিউ)

from firebase_functions.firestore_fn import (
  on_document_created,
  on_document_deleted,
  on_document_updated,
  on_document_written,
  Event,
  Change,
  DocumentSnapshot,
)

@on_document_created(document="users/{userId}")
def myfunction(event: Event[DocumentSnapshot]) -> None:

ডকুমেন্ট পাথগুলি কোনও নির্দিষ্ট নথি বা ওয়াইল্ডকার্ড প্যাটার্নটি উল্লেখ করতে পারে।

একটি একক নথি নির্দিষ্ট করুন

আপনি যদি কোনও নির্দিষ্ট নথিতে কোনও পরিবর্তনের জন্য কোনও ইভেন্ট ট্রিগার করতে চান তবে আপনি নিম্নলিখিত ফাংশনটি ব্যবহার করতে পারেন।

Node.js

import {
  onDocumentWritten,
  Change,
  FirestoreEvent
} from "firebase-functions/v2/firestore";

exports.myfunction = onDocumentWritten("users/marie", (event) => {
  // Your code here
});

পাইথন (প্রিভিউ)

from firebase_functions.firestore_fn import (
  on_document_written,
  Event,
  Change,
  DocumentSnapshot,
)

@on_document_written(document="users/marie")
def myfunction(event: Event[Change[DocumentSnapshot]]) -> None:

ওয়াইল্ডকার্ড ব্যবহার করে নথির একটি গ্রুপ নির্দিষ্ট করুন

আপনি যদি কোনও নির্দিষ্ট সংগ্রহের মতো কোনও দলিল যেমন কোনও গ্রুপের সাথে ট্রিগার সংযুক্ত করতে চান তবে ডকুমেন্ট আইডির জায়গায় একটি {wildcard} use ব্যবহার করুন:

Node.js

import {
  onDocumentWritten,
  Change,
  FirestoreEvent
} from "firebase-functions/v2/firestore";

exports.myfunction = onDocumentWritten("users/{userId}", (event) => {
  // If we set `/users/marie` to {name: "Marie"} then
  // event.params.userId == "marie"
  // ... and ...
  // event.data.after.data() == {name: "Marie"}
});

পাইথন (প্রিভিউ)

from firebase_functions.firestore_fn import (
  on_document_written,
  Event,
  Change,
  DocumentSnapshot,
)

@on_document_written(document="users/{userId}")
def myfunction(event: Event[Change[DocumentSnapshot]]) -> None:
  # If we set `/users/marie` to {name: "Marie"} then
  event.params["userId"] == "marie"  # True
  # ... and ...
  event.data.after.to_dict() == {"name": "Marie"}  # True

এই উদাহরণে, যখন users যে কোনও নথির কোনও ক্ষেত্র পরিবর্তন করা হয়, এটি userId নামে একটি ওয়াইল্ডকার্ডের সাথে মেলে।

যদি users মধ্যে কোনও নথিতে সাবকোলেকশন থাকে এবং সেই সাব -কালেকশনগুলির একটিতে একটি ক্ষেত্র পরিবর্তন করা হয় তবে userId ওয়াইল্ডকার্ডটি ট্রিগার করা হয় না

ওয়াইল্ডকার্ড ম্যাচগুলি ডকুমেন্টের পথ থেকে বের করা হয় এবং event.params সংরক্ষণ করা হয়। আপনি সুস্পষ্ট সংগ্রহ বা ডকুমেন্ট আইডিগুলির বিকল্প হিসাবে আপনি যতগুলি ওয়াইল্ডকার্ড সংজ্ঞায়িত করতে পারেন, উদাহরণস্বরূপ:

Node.js

import {
  onDocumentWritten,
  Change,
  FirestoreEvent
} from "firebase-functions/v2/firestore";

exports.myfunction = onDocumentWritten("users/{userId}/{messageCollectionId}/{messageId}", (event) => {
    // If we set `/users/marie/incoming_messages/134` to {body: "Hello"} then
    // event.params.userId == "marie";
    // event.params.messageCollectionId == "incoming_messages";
    // event.params.messageId == "134";
    // ... and ...
    // event.data.after.data() == {body: "Hello"}
});

পাইথন (প্রিভিউ)

from firebase_functions.firestore_fn import (
  on_document_written,
  Event,
  Change,
  DocumentSnapshot,
)

@on_document_written(document="users/{userId}/{messageCollectionId}/{messageId}")
def myfunction(event: Event[Change[DocumentSnapshot]]) -> None:
  # If we set `/users/marie/incoming_messages/134` to {body: "Hello"} then
  event.params["userId"] == "marie"  # True
  event.params["messageCollectionId"] == "incoming_messages"  # True
  event.params["messageId"] == "134"  # True
  # ... and ...
  event.data.after.to_dict() == {"body": "Hello"}

আপনি যদি কোনও ওয়াইল্ডকার্ড ব্যবহার করেন তবে আপনার ট্রিগারটি অবশ্যই সর্বদা একটি নথির দিকে নির্দেশ করতে হবে। উদাহরণস্বরূপ, users/{userId}/{messageCollectionId} বৈধ নয় কারণ {messageCollectionId} একটি সংগ্রহ। তবে, users/{userId}/{messageCollectionId}/{messageId} বৈধ কারণ {messageId} সর্বদা একটি নথিতে নির্দেশ করবে।

ইভেন্ট ট্রিগার

যখন একটি নতুন নথি তৈরি করা হয় তখন একটি ফাংশন ট্রিগার করুন

আপনি কোনও সংগ্রহে কোনও নতুন ডকুমেন্ট তৈরি করার সময় কোনও ফাংশন ট্রিগার করতে পারেন। এই উদাহরণ ফাংশনটি প্রতিবার নতুন ব্যবহারকারী প্রোফাইল যুক্ত হওয়ার সাথে সাথে ট্রিগার করে:

Node.js

import {
  onDocumentCreated,
  Change,
  FirestoreEvent
} from "firebase-functions/v2/firestore";

exports.createuser = onDocumentCreated("users/{userId}", (event) => {
    // Get an object representing the document
    // e.g. {'name': 'Marie', 'age': 66}
    const snapshot = event.data;
    if (!snapshot) {
        console.log("No data associated with the event");
        return;
    }
    const data = snapshot.data();

    // access a particular field as you would any JS property
    const name = data.name;

    // perform more operations ...
});

অতিরিক্ত প্রমাণীকরণের তথ্যের জন্য, onDocumentCreatedWithAuthContext ব্যবহার করুন।

পাইথন (প্রিভিউ)

from firebase_functions.firestore_fn import (
  on_document_created,
  Event,
  DocumentSnapshot,
)

@on_document_created(document="users/{userId}")
def myfunction(event: Event[DocumentSnapshot]) -> None:
  # Get a dictionary representing the document
  # e.g. {'name': 'Marie', 'age': 66}
  new_value = event.data.to_dict()

  # Access a particular field as you would any dictionary
  name = new_value["name"]

  # Perform more operations ...

একটি ডকুমেন্ট আপডেট করা হলে একটি ফাংশন ট্রিগার করুন

কোনও দস্তাবেজ আপডেট হলে আপনি আগুনের জন্য কোনও ফাংশনও ট্রিগার করতে পারেন। কোনও ব্যবহারকারী যদি তাদের প্রোফাইল পরিবর্তন করে তবে এই উদাহরণ ফাংশনটি আগুন লাগে:

Node.js

import {
  onDocumentUpdated,
  Change,
  FirestoreEvent
} from "firebase-functions/v2/firestore";

exports.updateuser = onDocumentUpdated("users/{userId}", (event) => {
    // Get an object representing the document
    // e.g. {'name': 'Marie', 'age': 66}
    const newValue = event.data.after.data();

    // access a particular field as you would any JS property
    const name = newValue.name;

    // perform more operations ...
});

অতিরিক্ত প্রমাণীকরণের তথ্যের জন্য, onDocumentUpdatedWithAuthContext ব্যবহার করুন।

পাইথন (প্রিভিউ)

from firebase_functions.firestore_fn import (
  on_document_updated,
  Event,
  Change,
  DocumentSnapshot,
)

@on_document_updated(document="users/{userId}")
def myfunction(event: Event[Change[DocumentSnapshot]]) -> None:
  # Get a dictionary representing the document
  # e.g. {'name': 'Marie', 'age': 66}
  new_value = event.data.after.to_dict()

  # Access a particular field as you would any dictionary
  name = new_value["name"]

  # Perform more operations ...

কোনও ডকুমেন্ট মুছে ফেলা হলে একটি ফাংশন ট্রিগার করুন

কোনও দস্তাবেজ মুছে ফেলা হলে আপনি কোনও ফাংশনও ট্রিগার করতে পারেন। এই উদাহরণ ফাংশনটি আগুন লাগে যখন কোনও ব্যবহারকারী তাদের ব্যবহারকারীর প্রোফাইল মুছে দেয়:

Node.js

import {
  onDocumentDeleted,
  Change,
  FirestoreEvent
} from "firebase-functions/v2/firestore";

exports.deleteuser = onDocumentDeleted("users/{userId}", (event) => {
    // Get an object representing the document
    // e.g. {'name': 'Marie', 'age': 66}
    const snap =  event.data;
    const data =  snap.data();

    // perform more operations ...
});

অতিরিক্ত প্রমাণীকরণের তথ্যের জন্য, onDocumentDeletedWithAuthContext ব্যবহার করুন।

পাইথন (প্রিভিউ)

from firebase_functions.firestore_fn import (
  on_document_deleted,
  Event,
  DocumentSnapshot,
)

@on_document_deleted(document="users/{userId}")
def myfunction(event: Event[DocumentSnapshot|None]) -> None:
  # Perform more operations ...

একটি নথিতে সমস্ত পরিবর্তনের জন্য একটি ফাংশন ট্রিগার করুন

যদি আপনি ইভেন্টের ধরণের নিক্ষেপ করা হচ্ছে সে সম্পর্কে যদি চিন্তা না করেন তবে আপনি "ডকুমেন্ট লিখিত" ইভেন্ট ট্রিগার ব্যবহার করে ক্লাউড ফায়ারস্টোর নথিতে সমস্ত পরিবর্তন শুনতে পারেন। কোনও ব্যবহারকারী তৈরি, আপডেট বা মুছে ফেলা হলে এই উদাহরণ ফাংশন আগুন লাগে:

Node.js

import {
  onDocumentWritten,
  Change,
  FirestoreEvent
} from "firebase-functions/v2/firestore";

exports.modifyuser = onDocumentWritten("users/{userId}", (event) => {
    // Get an object with the current document values.
    // If the document does not exist, it was deleted
    const document =  event.data.after.data();

    // Get an object with the previous document values
    const previousValues =  event.data.before.data();

    // perform more operations ...
});

অতিরিক্ত প্রমাণীকরণের তথ্যের জন্য, onDocumentWrittenWithAuthContext ব্যবহার করুন।

পাইথন (প্রিভিউ)

from firebase_functions.firestore_fn import (
  on_document_written,
  Event,
  Change,
  DocumentSnapshot,
)

@on_document_written(document="users/{userId}")
def myfunction(event: Event[Change[DocumentSnapshot | None]]) -> None:
  # Get an object with the current document values.
  # If the document does not exist, it was deleted.
  document = (event.data.after.to_dict()
              if event.data.after is not None else None)

  # Get an object with the previous document values.
  # If the document does not exist, it was newly created.
  previous_values = (event.data.before.to_dict()
                     if event.data.before is not None else None)

  # Perform more operations ...

ডেটা পড়া এবং লেখা

যখন কোনও ফাংশন ট্রিগার করা হয়, এটি ইভেন্টের সাথে সম্পর্কিত ডেটার একটি স্ন্যাপশট সরবরাহ করে। আপনি এই স্ন্যাপশটটি ইভেন্টটি ট্রিগার করে এমন নথিতে পড়তে বা লিখতে বা আপনার ডাটাবেসের অন্যান্য অংশগুলি অ্যাক্সেস করতে ফায়ারবেস অ্যাডমিন এসডিকে ব্যবহার করতে পারেন।

ইভেন্ট ডেটা

ডেটা পড়া

যখন কোনও ফাংশন ট্রিগার করা হয়, আপনি আপডেট হওয়া কোনও নথি থেকে ডেটা পেতে বা আপডেটের আগে ডেটা পেতে চাইতে পারেন। আপনি event.data.before আগে ব্যবহার করে পূর্বের ডেটা পেতে পারেন, এতে আপডেটের আগে ডকুমেন্ট স্ন্যাপশট রয়েছে। একইভাবে, event.data.after আপডেটের পরে ডকুমেন্ট স্ন্যাপশট স্টেট রয়েছে।

Node.js

exports.updateuser2 = onDocumentUpdated("users/{userId}", (event) => {
    // Get an object with the current document values.
    // If the document does not exist, it was deleted
    const newValues =  event.data.after.data();

    // Get an object with the previous document values
    const previousValues =  event.data.before.data();
});

পাইথন (প্রিভিউ)

@on_document_updated(document="users/{userId}")
def myfunction(event: Event[Change[DocumentSnapshot]]) -> None:
  # Get an object with the current document values.
  new_value = event.data.after.to_dict()

  # Get an object with the previous document values.
  prev_value = event.data.before.to_dict()

আপনি অন্য যে কোনও বস্তুর মতো বৈশিষ্ট্যগুলি অ্যাক্সেস করতে পারেন। বিকল্পভাবে, আপনি নির্দিষ্ট ক্ষেত্রগুলি অ্যাক্সেস করতে get ফাংশনটি ব্যবহার করতে পারেন:

Node.js

// Fetch data using standard accessors
const age = event.data.after.data().age;
const name = event.data.after.data()['name'];

// Fetch data using built in accessor
const experience = event.data.after.data.get('experience');

পাইথন (প্রিভিউ)

# Get the value of a single document field.
age = event.data.after.get("age")

# Convert the document to a dictionary.
age = event.data.after.to_dict()["age"]

ডেটা লেখা

প্রতিটি ফাংশন অনুরোধ আপনার ক্লাউড ফায়ারস্টোর ডাটাবেসে একটি নির্দিষ্ট নথির সাথে সম্পর্কিত। আপনি স্ন্যাপশটে সেই দস্তাবেজটি অ্যাক্সেস করতে পারেন আপনার ফাংশনে ফিরে এসেছেন।

ডকুমেন্ট রেফারেন্সে update() , set() , এবং remove() এর মতো পদ্ধতি অন্তর্ভুক্ত রয়েছে যাতে আপনি ফাংশনটি ট্রিগার করে এমন দস্তাবেজটি সংশোধন করতে পারেন।

Node.js

import { onDocumentUpdated } from "firebase-functions/v2/firestore";

exports.countnamechanges = onDocumentUpdated('users/{userId}', (event) => {
  // Retrieve the current and previous value
  const data = event.data.after.data();
  const previousData = event.data.before.data();

  // We'll only update if the name has changed.
  // This is crucial to prevent infinite loops.
  if (data.name == previousData.name) {
    return null;
  }

  // Retrieve the current count of name changes
  let count = data.name_change_count;
  if (!count) {
    count = 0;
  }

  // Then return a promise of a set operation to update the count
  return data.after.ref.set({
    name_change_count: count + 1
  }, {merge: true});

});

পাইথন (প্রিভিউ)

@on_document_updated(document="users/{userId}")
def myfunction(event: Event[Change[DocumentSnapshot]]) -> None:
  # Get the current and previous document values.
  new_value = event.data.after
  prev_value = event.data.before

  # We'll only update if the name has changed.
  # This is crucial to prevent infinite loops.
  if new_value.get("name") == prev_value.get("name"):
      return

  # Retrieve the current count of name changes
  count = new_value.to_dict().get("name_change_count", 0)

  # Update the count
  new_value.reference.update({"name_change_count": count + 1})

ব্যবহারকারী প্রমাণীকরণের তথ্য অ্যাক্সেস করুন

আপনি যদি নিম্নলিখিত ইভেন্টের ধরণের একটি ব্যবহার করেন তবে আপনি ইভেন্টটি ট্রিগার করে এমন অধ্যক্ষ সম্পর্কে ব্যবহারকারীর প্রমাণীকরণের তথ্য অ্যাক্সেস করতে পারেন। এই তথ্য বেস ইভেন্টে ফিরে আসা তথ্য ছাড়াও।

Node.js

  • onDocumentCreatedWithAuthContext
  • onDocumentWrittenWithAuthContext
  • onDocumentDeletedWithAuthContext
  • onDocumentUpdatedWithAuthContext

পাইথন (প্রিভিউ)

  • on_document_created_with_auth_context
  • on_document_updated_with_auth_context
  • on_document_deleted_with_auth_context
  • on_document_written_with_auth_context

প্রমাণীকরণ প্রসঙ্গে উপলভ্য ডেটা সম্পর্কে তথ্যের জন্য, লেখক প্রসঙ্গটি দেখুন। নিম্নলিখিত উদাহরণটি প্রমাণীকরণের তথ্য কীভাবে পুনরুদ্ধার করবেন তা প্রদর্শন করে:

Node.js

import { onDocumentWrittenWithAuthContext } from "firebase-functions/v2/firestore"

exports.syncUser = onDocumentWrittenWithAuthContext("users/{userId}", (event) => {
    const snapshot = event.data.after;
    if (!snapshot) {
        console.log("No data associated with the event");
        return;
    }
    const data = snapshot.data();

    // retrieve auth context from event
    const { authType, authId } = event;

    let verified = false;
    if (authType === "system") {
      // system-generated users are automatically verified
      verified = true;
    } else if (authType === "unknown" || authType === "unauthenticated") {
      // admin users from a specific domain are verified
      if (authId.endsWith("@example.com")) {
        verified = true;
      }
    }

    return data.after.ref.set({
        created_by: authId,
        verified,
    }, {merge: true}); 
}); 

পাইথন (প্রিভিউ)

@on_document_updated_with_auth_context(document="users/{userId}")
def myfunction(event: Event[Change[DocumentSnapshot]]) -> None:

  # Get the current and previous document values.
  new_value = event.data.after
  prev_value = event.data.before

  # Get the auth context from the event
  user_auth_type = event.auth_type
  user_auth_id = event.auth_id

ট্রিগার ইভেন্টের বাইরে ডেটা

Cloud Functions একটি বিশ্বস্ত পরিবেশে কার্যকর করে। এগুলি আপনার প্রকল্পে একটি পরিষেবা অ্যাকাউন্ট হিসাবে অনুমোদিত এবং আপনি ফায়ারবেস অ্যাডমিন এসডিকে ব্যবহার করে পড়া এবং লেখার জন্য লিখতে পারেন:

Node.js

const { initializeApp } = require('firebase-admin/app');
const { getFirestore, Timestamp, FieldValue } = require('firebase-admin/firestore');

initializeApp();
const db = getFirestore();

exports.writetofirestore = onDocumentWritten("some/doc", (event) => {
    db.doc('some/otherdoc').set({ ... });
  });

  exports.writetofirestore = onDocumentWritten('users/{userId}', (event) => {
    db.doc('some/otherdoc').set({
      // Update otherdoc
    });
  });

পাইথন (প্রিভিউ)

from firebase_admin import firestore, initialize_app
import google.cloud.firestore

initialize_app()

@on_document_written(document="some/doc")
def myfunction(event: Event[Change[DocumentSnapshot | None]]) -> None:
  firestore_client: google.cloud.firestore.Client = firestore.client()
  firestore_client.document("another/doc").set({
      # ...
  })

সীমাবদ্ধতা

Cloud Firestore ট্রিগারগুলির জন্য নিম্নলিখিত সীমাবদ্ধতাগুলি Cloud Functions জন্য নোট করুন:

  • Cloud Functions (1 ম জেন) ফায়ারস্টোর নেটিভ মোডে একটি বিদ্যমান "(ডিফল্ট)" ডাটাবেস পূর্বশর্ত। এটি ডাটাবেস বা ডেটাস্টোর মোডের নামযুক্ত Cloud Firestore সমর্থন করে না। এই জাতীয় ক্ষেত্রে ইভেন্টগুলি কনফিগার করতে দয়া করে Cloud Functions (২ য় জেন) ব্যবহার করুন।
  • অর্ডারিং গ্যারান্টিযুক্ত নয়। দ্রুত পরিবর্তনগুলি একটি অপ্রত্যাশিত ক্রমে ফাংশন অনুরোধগুলি ট্রিগার করতে পারে।
  • ইভেন্টগুলি কমপক্ষে একবার সরবরাহ করা হয়, তবে একটি একক ইভেন্টের ফলে একাধিক ফাংশন আহ্বান হতে পারে। ঠিক একবার মেকানিক্সের উপর নির্ভর করে এড়িয়ে চলুন এবং আদর্শিক ফাংশনগুলি লিখুন।
  • ডেটাস্টোর মোডে Cloud Firestore Cloud Functions (২ য় জেন) প্রয়োজন। Cloud Functions (1 ম জেন) ডেটাস্টোর মোডকে সমর্থন করে না।
  • একটি ট্রিগার একটি একক ডাটাবেসের সাথে যুক্ত। আপনি একাধিক ডাটাবেসের সাথে মেলে এমন একটি ট্রিগার তৈরি করতে পারবেন না।
  • একটি ডাটাবেস মুছে ফেলা সেই ডাটাবেসের জন্য স্বয়ংক্রিয়ভাবে কোনও ট্রিগার মুছবে না। ট্রিগারটি ইভেন্টগুলি সরবরাহ করা বন্ধ করে দেয় তবে আপনি ট্রিগারটি মুছ না হওয়া অবধি অবিরত রয়েছে।
  • যদি কোনও মিলে যাওয়া ইভেন্ট সর্বাধিক অনুরোধের আকারকে ছাড়িয়ে যায় তবে ইভেন্টটি Cloud Functions (1 ম জেন) সরবরাহ করা যেতে পারে না।
    • অনুরোধ আকারের কারণে বিতরণ করা হয়নি এমন ইভেন্টগুলি প্ল্যাটফর্ম লগগুলিতে লগ ইন করা হয় এবং প্রকল্পের জন্য লগ ব্যবহারের দিকে গণনা করা হয়।
    • error তীব্রতার 1 ম জেনার ... "এর সীমা ছাড়িয়ে আকারের কারণে" ইভেন্টটি ক্লাউড ফাংশনে সরবরাহ করতে পারে না এমন বার্তাটি দিয়ে আপনি লগগুলি এক্সপ্লোরারে এই লগগুলি খুঁজে পেতে পারেন। আপনি functionName ক্ষেত্রের অধীনে ফাংশন নামটি খুঁজে পেতে পারেন। যদি receiveTimestamp ক্ষেত্রটি এখনও থেকে এখনও এক ঘন্টার মধ্যে থাকে তবে আপনি টাইমস্ট্যাম্পের আগে এবং পরে স্ন্যাপশট দিয়ে প্রশ্নে নথিটি পড়ে প্রকৃত ইভেন্টের সামগ্রীটি অনুমান করতে পারেন।
    • এই জাতীয় ক্যাডেন্স এড়াতে, আপনি পারেন:
      • মাইগ্রেট করুন এবং Cloud Functions আপগ্রেড করুন (২ য় জেন)
      • ডকুমেন্ট ডাউনসাইজ করুন
      • প্রশ্নে Cloud Functions মুছুন
    • আপনি ব্যতিক্রমগুলি ব্যবহার করে নিজেই লগিং বন্ধ করতে পারেন তবে নোট করুন যে আপত্তিজনক ইভেন্টগুলি এখনও সরবরাহ করা হবে না।