ফায়ার স্টোর দিয়ে কীভাবে একটি "অ্যারে অবজেক্টস" আপডেট করবেন?


114

আমি বর্তমানে ফায়ারস্টোর চেষ্টা করছি, এবং আমি খুব সাধারণ কিছুতে আটকে আছি: "একটি অ্যারে আপডেট করা (ওরফে একটি সাবডোকামেন্ট)"।

আমার ডিবি কাঠামো অত্যন্ত সহজ। উদাহরণ স্বরূপ:

proprietary: "John Doe",
sharedWith:
  [
    {who: "first@test.com", when:timestamp},
    {who: "another@test.com", when:timestamp},
  ],

আমি চেষ্টা করছি (সাফল্য ছাড়াই) shareWithঅবজেক্টগুলির অ্যারেতে নতুন রেকর্ডগুলি ঠেলে দিতে ।

আমি চেষ্টা করেছিলাম:

// With SET
firebase.firestore()
.collection('proprietary')
.doc(docID)
.set(
  { sharedWith: [{ who: "third@test.com", when: new Date() }] },
  { merge: true }
)

// With UPDATE
firebase.firestore()
.collection('proprietary')
.doc(docID)
.update({ sharedWith: [{ who: "third@test.com", when: new Date() }] })

কোনটিই কাজ করে না। এই প্রশ্নগুলি আমার অ্যারে ওভাররাইট করে।

উত্তরটি সহজ হতে পারে তবে আমি এটি খুঁজে পেতাম না ...


আরে তুমি কি তা বের করেছ? আমি এখনও একটি উত্তর খুঁজে পাচ্ছি না।
যশ জৈন

উত্তর:


78

08/13/2018 সম্পাদনা করুন : ক্লাউড ফায়ার স্টোরে দেশীয় অ্যারে ক্রিয়াকলাপের জন্য এখন সমর্থন রয়েছে। দেখুন ডগ এর উত্তর নিচে।


ক্লাউড ফায়ার স্টোরে একক অ্যারে উপাদান আপডেট করার (বা কোনও একক উপাদান যুক্ত / সরানোর) কোনও উপায় নেই।

এই কোড এখানে:

firebase.firestore()
.collection('proprietary')
.doc(docID)
.set(
  { sharedWith: [{ who: "third@test.com", when: new Date() }] },
  { merge: true }
)

এই সময়ে দলিল সেট করতে বলছেন proprietary/docIDযেমন যে sharedWith = [{ who: "third@test.com", when: new Date() }কিন্তু কোনো বিদ্যমান নথির বৈশিষ্ট্য প্রভাবিত করে না করে। এটি update()আপনার প্রদত্ত set()কলটির সাথে খুব মিল তবে ডকুমেন্টটি তৈরি করার সাথে কলটি উপস্থিত না থাকলে update()কলটি ব্যর্থ হবে।

সুতরাং আপনি যা চান তা অর্জন করার জন্য আপনার কাছে দুটি বিকল্প রয়েছে।

বিকল্প 1 - পুরো অ্যারে সেট করুন

set()অ্যারের পুরো বিষয়বস্তু সহ কল করুন , যার জন্য প্রথমে ডিবি থেকে বর্তমান তথ্য পড়তে হবে। আপনি যদি সমকালীন আপডেটগুলি সম্পর্কে উদ্বিগ্ন হন তবে আপনি লেনদেনে এই সমস্ত কিছু করতে পারেন।

বিকল্প 2 - একটি উপ-সংগ্রহ ব্যবহার করুন

আপনি sharedWithপ্রধান দস্তাবেজের একটি উপক্লিকেশন করতে পারেন । তারপরে একটি আইটেম যুক্ত করা এইরকম দেখতে পাবেন:

firebase.firestore()
  .collection('proprietary')
  .doc(docID)
  .collection('sharedWith')
  .add({ who: "third@test.com", when: new Date() })

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


9
এটি হতাশার ... তবে আমাকে জানাতে ধন্যবাদ যে আমি পাগল হয়ে যাচ্ছি না।
ItJustWerks

53
এটি বড় অসুবিধা, গুগলকে এটিকে তত দ্রুত ঠিক করতে হবে।
সাজিথ মনথারথ

4
@ ডগ গ্যালেন্টের উত্তরটি নির্দেশ করে যে এটি স্থির হয়ে গেছে। arrayUnionপদ্ধতিটি ব্যবহার করুন ।
কুইকল্ল্যাব্রবিত

158

ফায়ার স্টোরে এখন দুটি ফাংশন রয়েছে যা আপনাকে পুরো জিনিসটি পুনরায় না লিখে কোনও অ্যারে আপডেট করতে দেয়।

লিঙ্ক: https://firebase.google.com/docs/firestore/manage-data/add-data বিশেষত https://firebase.google.com/docs/firestore/manage-data/add-data#update_e উপাদান_ in_an_array

একটি অ্যারেতে উপাদানগুলি আপডেট করুন

যদি আপনার নথিতে একটি অ্যারে ক্ষেত্র থাকে, আপনি উপাদান যুক্ত করতে এবং মুছে ফেলার জন্য অ্যারেউইনিয়ন () এবং অ্যারেরেমোভ () ব্যবহার করতে পারেন। অ্যারেউনিয়ন () অ্যারেতে উপাদান যুক্ত করে তবে কেবল উপাদানগুলি ইতিমধ্যে উপস্থিত নেই। অ্যারে রিমোভ () প্রতিটি প্রদত্ত উপাদানগুলির সমস্ত দৃষ্টান্ত সরিয়ে দেয়।


63
অ্যারে থেকে কোনও নির্দিষ্ট সূচক আপডেট করার কোনও উপায় আছে কি?
আর্টুর কারভালহো

4
"বিক্রিয়া-নেটিভ-ফায়ারবেস" দিয়ে এই অ্যারে আপডেট বৈশিষ্ট্যটি কীভাবে ব্যবহার করবেন? (আমি এটি স্থানীয়-ফায়ারব্যাকের
রিঅ্যাক্টের অফিসিয়াল ডক্সে

5
@ArturCarvalho না, কারণ এই ভিডিওতে ব্যাখ্যা করা হয় youtube.com/...
আদম

4
যার ক্লায়েন্টে এটি করা দরকার, "'ফায়ারবেস / অ্যাপ্লিকেশন' থেকে ফায়ারবেস হিসাবে আমদানি করুন"; তারপরে "ফায়ারবেস.ফায়ারস্টোর.ফিল্ডভ্যালিউ.আরআরইউনিয়ন (নিউ_ইলেমেন্ট)"
মাইকেললেপাট্রি

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

16

অ্যারে পেতে আপনি একটি লেনদেন ( https://firebase.google.com/docs/firestore/manage-data/transferences ) ব্যবহার করতে পারেন , এটিতে চাপ দিন এবং তারপরে নথিটি আপডেট করুন:

    const booking = { some: "data" };
    const userRef = this.db.collection("users").doc(userId);

    this.db.runTransaction(transaction => {
        // This code may get re-run multiple times if there are conflicts.
        return transaction.get(userRef).then(doc => {
            if (!doc.data().bookings) {
                transaction.set({
                    bookings: [booking]
                });
            } else {
                const bookings = doc.data().bookings;
                bookings.push(booking);
                transaction.update(userRef, { bookings: bookings });
            }
        });
    }).then(function () {
        console.log("Transaction successfully committed!");
    }).catch(function (error) {
        console.log("Transaction failed: ", error);
    });

4
বিবৃতি যদি আপনি এই সেটিকে পরিবর্তন করা উচিত, কারণ আপনি অনুপস্থিত documentReferenceঅ্যাড userRefদেখানো হয়েছে: transaction.set(userRef, { bookings: [booking] });
Ilir থেকে Hushi

15

ফায়ারস্টোর ডকুমেন্টেশন এর সর্বশেষ উদাহরণ এখানে:

ফায়ারবেস.ফায়ারস্টোর.ফিল্ডভ্যালু। অ্যারেউনিয়ন

var washingtonRef = db.collection("cities").doc("DC");

// Atomically add a new region to the "regions" array field.
washingtonRef.update({
    regions: firebase.firestore.FieldValue.arrayUnion("greater_virginia")
});

// Atomically remove a region from the "regions" array field.
washingtonRef.update({
    regions: firebase.firestore.FieldValue.arrayRemove("east_coast")
});

4
@nifCody, এটি প্রকৃতপক্ষে একটি বিদ্যমান অ্যারে "অঞ্চলে" একটি নতুন স্ট্রিং উপাদান "বৃহত্তর_ ভার্জিনিয়া" যুক্ত করবে। আমি এটি সফলভাবে পরীক্ষা করেছি এবং অবশ্যই "অবজেক্ট" যুক্ত করছি না। যেমনটি বলা হয়েছে প্রশ্নের সাথে একত্রে এটি রয়েছে: "নতুন রেকর্ডগুলি ধাক্কা"।
বীরেশ ডিভিরডিডি

7

দুঃখিত, পার্টিতে লেট কিন্তু ফায়ারস্টোর এটি আগস্ট 2018 এর দিকে আবার সমাধান করেছে তাই আপনি যদি এখনও এটির জন্য সন্ধান করেন তবে এটি অ্যারে সম্পর্কিত সমস্ত বিষয়ই সমাধান করা হয়েছে।

https://firebase.googleblog.com/2018/08/better-arrays-in-cloud-firestore.html অফিসিয়াল ব্লগ পোস্ট

অ্যারে ধারণ করে, অ্যারে রিমোভ, অ্যারে চেক, অপসারণ এবং আপডেট করার জন্য অ্যারে ইউনিয়ন আশা করি এটা সাহায্য করবে.


4

উপর গড়ে তুলতে স্যাম স্টার্ন এর উত্তর , সেখানে একটি হল 3 য় বিকল্প যা কিছু করার অধিকার আমার সহজ করে এবং ব্যবহার করছে যা Google কী কল একটি মানচিত্র যা মূলত একটি অভিধান আছে।

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

সুতরাং আপনার নির্দিষ্ট কেসের জন্য, ডিবি কাঠামোটি দেখতে এমন হবে:

proprietary: "John Doe"
sharedWith:{
  whoEmail1: {when: timestamp},
  whoEmail2: {when: timestamp}
}

এটি আপনাকে নিম্নলিখিতগুলি করতে অনুমতি দেবে:

var whoEmail = 'first@test.com';

var sharedObject = {};
sharedObject['sharedWith.' + whoEmail + '.when'] = new Date();
sharedObject['merge'] = true;

firebase.firestore()
.collection('proprietary')
.doc(docID)
.update(sharedObject);

ভেরিয়েবল হিসাবে অবজেক্টটি সংজ্ঞায়িত করার কারণ হ'ল 'sharedWith.' + whoEmail + '.when'কমপক্ষে কোনও নোড.জেএস ক্লাউড ফাংশনে ব্যবহার করার সময় সেট পদ্ধতিতে সরাসরি ব্যবহার করার ফলে একটি ত্রুটি ঘটবে।


2

উপরে উল্লিখিত উত্তরগুলি ছাড়া অন্য। এটি এটি করবে। অ্যাঙ্গুলার 5 এবং অ্যাঙ্গুলার ফায়ার 2 ব্যবহার করে। অথবা এই.এফএসের পরিবর্তে ফায়ারবেস.ফায়ার স্টোর () ব্যবহার করুন

  // say you have have the following object and 
  // database structure as you mentioned in your post
  data = { who: "third@test.com", when: new Date() };

  ...othercode


  addSharedWith(data) {

    const postDocRef = this.afs.collection('posts').doc('docID');

    postDocRef.subscribe( post => {

      // Grab the existing sharedWith Array
      // If post.sharedWith doesn`t exsit initiated with empty array
      const foo = { 'sharedWith' : post.sharedWith || []};

      // Grab the existing sharedWith Array
      foo['sharedWith'].push(data);

      // pass updated to fireStore
      postsDocRef.update(foo);
      // using .set() will overwrite everything
      // .update will only update existing values, 
      // so we initiated sharedWith with empty array
    });
 }  

1

জন দো কোনও সংগ্রহের চেয়ে একটি নথি বিবেচনা করুন

এটিকে জিনিস ও জিনিসগুলির শেয়ারডবিথঅথার্সের সংগ্রহ দিন

তারপরে আপনি জন ড এর ভাগ করা জিনিসগুলি সেই সমান্তরাল জিনিসগুলি ভাগ করে নেওয়া উইথঅথার্স সংগ্রহে ম্যাপ করতে এবং জিজ্ঞাসা করতে পারেন।

proprietary: "John Doe"(a document)

things(collection of John's things documents)

thingsSharedWithOthers(collection of John's things being shared with others):
[thingId]:
    {who: "first@test.com", when:timestamp}
    {who: "another@test.com", when:timestamp}

then set thingsSharedWithOthers

firebase.firestore()
.collection('thingsSharedWithOthers')
.set(
{ [thingId]:{ who: "third@test.com", when: new Date() } },
{ merge: true }
)

1

arrayUnion({})এটি অর্জনে আমরা পদ্ধতি ব্যবহার করতে পারি।

এটা চেষ্টা কর:

collectionRef.doc(ID).update({
    sharedWith: admin.firestore.FieldValue.arrayUnion({
       who: "first@test.com",
       when: new Date()
    })
});

ডকুমেন্টেশন এখানে খুঁজে পেতে পারেন: https://firebase.google.com/docs/firestore/manage-data/add-data#update_elements_in_an_array


0

যদি অ্যারে ক্ষেত্রে আইটেম যুক্ত করার জন্য কেউ জাভা ফায়ারস্টোর এসডিকে সমাধান খুঁজছেন:

List<String> list = java.util.Arrays.asList("A", "B");
Object[] fieldsToUpdate = list.toArray();
DocumentReference docRef = getCollection().document("docId");
docRef.update(fieldName, FieldValue.arrayUnion(fieldsToUpdate));

অ্যারে ব্যবহারকারী থেকে আইটেমগুলি মুছতে: FieldValue.arrayRemove()


0
addToCart(docId: string, prodId: string): Promise<void> {
    return this.baseAngularFirestore.collection('carts').doc(docId).update({
        products:
        firestore.FieldValue.arrayUnion({
            productId: prodId,
            qty: 1
        }),
    });
}

4
দয়া করে আপনার উত্তরটি ব্যাখ্যা করুন।
জেনিয়া ভ্রান্সানু

প্রকৃতপক্ষে, দয়া করে পড়ুন stackoverflow.com/help/how-to-answer
jasie

0

আপনি যদি ফায়ারবেস নথিতে একটি অ্যারে আপডেট করতে চান। তুমি এটি করতে পারো.

    var documentRef = db.collection("Your collection name").doc("Your doc name")

    documentRef.update({
yourArrayName: firebase.firestore.FieldValue.arrayUnion("The Value you want to enter")});
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.