Firestore - 如何从值映射中添加/减去

时间:2018-05-10 03:19:08

标签: angular firebase google-cloud-firestore angularfire2

我遵循Firestore存储数组的说明: https://firebase.google.com/docs/firestore/solutions/arrays

现在我想做的就是推送到这张地图。例如,我现在有:

Contacts
   contact1: true

但我想添加或删除联系人,例如:

Contacts
   contact1: true
   contact2: true

我尝试过使用联系人地图并使用推送方法,但我认为这不会起作用,因为它不是传统的数组。例如:

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);
  });

有没有更简单的方法 - 我错过了什么?

2 个答案:

答案 0 :(得分:3)

首先,您不能在对象上使用push方法,因为地图不是数组。

您只需使用.[]运算符即可在JS中访问/添加/更新地图的值。

如果存储在Firestore中的对象(如Arrays和Objects),则无法直接“推送”它们的值。首先需要获取包含它们的文档,然后在本地更新它们的值。

完成此操作后,您将值更新为Firestore。

为简化此过程,您可以使用Firestore SDK或Admin SDK提供的runTransaction()方法,如果您使用的是Cloud Functions。

以下是为您完成工作的代码。

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));
});

答案 1 :(得分:3)

只需推入地图

使用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!");

});