Firestore पाइपलाइन ऑपरेशन की मदद से डेटा में बदलाव करना

डेटा पाइपलाइन बनाने के लिए, डेटा मैनिपुलेशन लैंग्वेज (डीएमएल) के update(...) और delete(...) चरणों का इस्तेमाल करें. इन पाइपलाइन से, दस्तावेज़ों के लिए क्वेरी की जा सकती है. इसके बाद, डेटा मिटाया या उसमें बदलाव किया जा सकता है.

एडिशन से जुड़ी ज़रूरी शर्तें

इस पेज पर बताई गई कार्रवाइयों के लिए, Firestore Enterprise एडिशन ज़रूरी है.

शुरू करने से पहले

आपको पाइपलाइन की कार्रवाइयों की मदद से, डेटाबेस के लिए क्वेरी करने का तरीका पता होना चाहिए.

दस्तावेज़ अपडेट करना

डेटा पाइपलाइन बनाने के लिए, डीएमएल के update(...) चरण का इस्तेमाल करें. इन पाइपलाइन से, दस्तावेज़ों के लिए क्वेरी की जा सकती है. इसके बाद, डेटा जोड़ा या उसमें बदलाव किया जा सकता है.

डीएमएल के सभी चरण, पाइपलाइन के आखिर में होने चाहिए. इस चरण में आने वाले दस्तावेज़ों में, __name__ फ़ील्ड शामिल होना चाहिए. इससे यह पता चलता है कि किन दस्तावेज़ों को अपडेट करना है. अगर अपडेट किए जाने वाले कोई भी दस्तावेज़ मौजूद नहीं है, तो कार्रवाई पूरी नहीं हो पाएगी.

उदाहरण के लिए, यहां दी गई कार्रवाई, कलेक्शन ग्रुप के सभी दस्तावेज़ों में डेटा मॉडल में हुए बदलाव को बैकफ़िल करती है. पाइपलाइन, users कलेक्शन ग्रुप के उन सभी दस्तावेज़ों में preferences.color फ़ील्ड जोड़ती है जिनमें यह फ़ील्ड मौजूद नहीं है.

Node.js
const snapshot = await db.pipeline()
   .collectionGroup("users")
   .where(not(exists(field("preferences.color"))))
   .addFields(constant(null).as("preferences.color"))
   .removeFields("color")
   .update()
   .execute();
Python
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()
)
Java
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(...) चरण का इस्तेमाल करें. इन पाइपलाइन से, दस्तावेज़ों के लिए क्वेरी की जा सकती है . इसके बाद, डेटा मिटाया जा सकता है. गलती से एक साथ कई दस्तावेज़ मिटने से रोकने के लिए, delete(...) पर खत्म होने वाली पाइपलाइन में कम से कम एक where(...) चरण शामिल होना चाहिए. डीएमएल के सभी चरण, पाइपलाइन के आखिर में होने चाहिए.

उदाहरण के लिए, यहां दी गई पाइपलाइन, users के उन सभी दस्तावेज़ों को मिटाती है जिनमें address.users की वैल्यू USA है और __create_time__ 10 दिनों से कम है:

Node.js
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();
Python
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()
)
Java
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() चरणों वाली पाइपलाइन की कार्रवाइयों का इस्तेमाल नहीं किया जा सकता. डीएमएल के चरण, लेन-देन के बाहर इस तरह काम करते हैं:

  • हर दस्तावेज़ को अलग-अलग अपडेट किया जाता है. इसका मतलब है कि कार्रवाइयां, सभी दस्तावेज़ों पर एक साथ नहीं की जाती हैं. पहली गड़बड़ी पर कार्रवाई पूरी नहीं हो पाती है. हालांकि, ऐसा हो सकता है कि कुछ दस्तावेज़ों पर कार्रवाई पूरी हो जाए.
  • इन चरणों का इस्तेमाल किया जा सकता है:
    • collection(...)
    • collection_group(...)
    • where(...)
    • select(...)
    • add_fields(...)
    • remove_fields(...)
    • let(...)
    • sort(...)
    • limit(...)
    • offset(...)
  • इन चरणों का इस्तेमाल नहीं किया जा सकता:
    • aggregate(...)
    • distinct(...)
    • unnest(...)
    • find_nearest(...)
    • डीएमएल के चरण से पहले, एक से ज़्यादा क्वेरी वाले चरणों का इस्तेमाल नहीं किया जा सकता. जैसे, union(...), जॉइन, और सब-क्वेरी.

सीमाएं

डीएमएल के चरणों के लिए, इन सीमाओं का ध्यान रखें:

  • डीएमएल के चरण, .execute() को कॉल करने से पहले, पाइपलाइन की परिभाषा के आखिरी चरण होने चाहिए.
  • लेन-देन के दौरान, update(...) और delete() चरणों वाली पाइपलाइन की कार्रवाइयों का इस्तेमाल नहीं किया जा सकता.
  • अगर डीएमएल के चरण से पहले वाला चरण, एक ही __name__ वाले कई दस्तावेज़ जनरेट करता है, तो हर इंस्टेंस को प्रोसेस किया जाता है. update(...) के लिए, इसका मतलब है कि एक ही टारगेट दस्तावेज़ में कई बार बदलाव किया जा सकता है. delete(...) के लिए, पहली बार के बाद की कोशिशें, नो-ऑप होंगी.