Firestore - как сложить / вычесть из карты значений - PullRequest
0 голосов
/ 10 мая 2018

Я следую инструкциям 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);
  });

Есть ли более простой способ сделать это - я что-то упустил?

Ответы [ 2 ]

0 голосов
/ 14 декабря 2018

Просто нажмите на карту

используйте 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!");

});
0 голосов
/ 10 мая 2018

Во-первых, вы не можете использовать метод push для объекта, поскольку карта не является массивом.

Вы можете просто использовать операторы . или [] для доступа / добавления / обновления значений карты в JS.

В случае объектов, хранящихся в пожарном хранилище, таких как Массивы и Объекты, вы не можете прямо "подтолкнуть" значения к ним. Сначала вам нужно получить документ, содержащий их, а затем обновить их значение локально.

После этого вы обновите значение до Firestore.

Чтобы упростить процесс, вы можете использовать метод runTransaction(), предоставляемый Firestore SDK или 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));
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...