配列を保存するための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);
});
これを行う簡単な方法はありますか?何か不足していますか?
まず、マップは配列ではないため、オブジェクトに対して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));
});
_
地図にプッシュするだけ
次のように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!");
});