web-dev-qa-db-ja.com

Firestore-値のマップから追加/削除する方法

配列を保存するためのFirestoreの手順に従っています: https://firebase.google.com/docs/firestore/solutions/arrays

次に、このマップにプッシュします。たとえば、今私は持っています:

Contacts
   contact1: true

しかし、私は例えば連絡先を追加または削除したいと思います:

Contacts
   contact1: true
   contact2: true

連絡先マップを取得し、Pushメソッドを使用してみましたが、これは従来の配列ではないため機能しないと思います。例えば:

this.afs
  .doc(`groups/${group.id}`)
  .ref.get()
  .then(doc => {
    let contacts: Array<any> = doc.data().contacts;

    contacts.Push({ // error here as Push is not a function
      [contactId]: true
    });

    console.log(contacts);
  });

これを行う簡単な方法はありますか?何か不足していますか?

6
rhysclay

まず、マップは配列ではないため、オブジェクトに対してPushメソッドを使用できません。

_._または_[]_演算子を使用して、JSのマップの値にアクセス/追加/更新できます。

配列やオブジェクトなど、firestoreに格納されているオブジェクトの場合、実際に値を直接「プッシュ」することはできません。まず、それらを含むドキュメントを取得し、それらの値をローカルで更新する必要があります。

その後、値をFirestoreに更新します。

プロセスを簡素化するには、Firestore SDKで提供されているrunTransaction()メソッドを使用できます。CloudFunctionsを使用している場合は、Admin SDKを使用できます。

ここにあなたのために仕事を終わらせるコードがあります。

_const docRef = this.afs.doc(`groups/${groupId}`);

db.runTransaction((t) => { // db is the firestore instance
  return t.get(docRef).then((doc) => { // getting the document from Firestore
    // {} is a fallback for the case if the "obj" is not present in the firestore
    const obj = doc.get("contacts") ? doc.get("contacts") : {};
    obj[contactId] = true; // updating the value here locally

    t.set(docRef, { contacts: obj }, { // updating the value to Firestore.
      merge: true,
    });

    return;
  }).then((result) => {
    console.log('map updated', result);
    return;
  }).catch((error) => handleError(error));
});
_
7
Utkarsh

地図にプッシュするだけ

次のようにupdate()を使用します

const db = firebase.firestore();
const collection = db.collection('collectionId');

collection.doc(`groups/${group.id}`).update({

      "Contacts.contact3":true

    }).then(function(){

       console.log("Successfully updated!");

});
11
voomin kim