Во-первых, вы не можете использовать метод 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));
});