participantUIDs
— это карта в документе Firestore:
Я получаю этот документ из Firestore (эта часть выполнена успешно) и пытаюсь перебрать карту, чтобы поместить ее ключи в виде строк в массив. К сожалению, это не работает. Консоль говорит, что я не могу использовать forEach
(и обычный цикл for) в participantUIDsMap
. Что не так с моей картой?
const chatDoc = await admin.firestore().doc(`group_chats/${context.params.chatId}`).get()
// the document is retrieved successfully, I checked it with another field.
const participantUIDsMap: Map<string, boolean> = chatDoc.get('participantUIDs')
const participantUIDsArray: string[] = []
participantUIDsMap.forEach((value, key) => {
if (value === true && key != senderUid) {
participantUIDsArray.push(key)
}
})
chatDoc.get('participantUIDs')
не будет возвращать объект карты ES6. Если именованное поле представляет собой поле типа карты, оно возвращает простой объект JavaScript, имена свойств которого совпадают с именами полей в поле карты Firestore. Поэтому forEach не сработает — на этом объекте такого метода просто нет. Итак, если вы хотите сделать предположение, что memberUID — это поле карты Firebase, ваше задание должно выглядеть примерно так:
const participantUIDs: any = chatDoc.get('participantUIDs')
Если вы хотите повторить свойства этого объекта, вы можете использовать один из многих вариантов, предоставляемых JavaScript. См.: Перебор свойств объекта
Да, здесь вы «теряете» информацию о типе, и да, вам, вероятно, следует проводить больше ручной проверки типов для всего, если вы не можете безопасно делать предположения о типах. Firestore SDK просто не предоставляет этого для вас, поскольку к документам не применяется схема.
Я знаю, что это старо, но я столкнулся с той же проблемой и смог решить ее следующим образом:
const docRef = doc(db, "collection", "id");
const docSnap = await getDoc(docRef);
if (docSnap.exists()) {
console.info("Document data:", docSnap.data());
console.info("Map field:", docSnap.data().mapField)
docSnap.data().mapField.forEach((value, key) => {
console.info('Value', value, 'key', key)
})
} else {
// doc.data() will be undefined in this case
console.info("No such document!");
}
Спасибо за пояснение!