Firebase Firestore — доступ к документу в другом документе с неизвестным идентификатором

#reactjs #firebase #google-cloud-firestore

#reactjs #firebase #google-облако-firestore

Вопрос:

я не знаю, как получить доступ к нескольким документам внутри документа с неизвестным именем. Вот моя структура Firebase Firestore:

  • бизнес
    • unknownbusinessid1
      • Рекламные акции
        • unknownpromotionid1
        • unknownpromotionid2 (…)
    • unknownbusinessid2 (…)
    • unknownbusinessid3 (…)

чего я хотел бы добиться, так это получить все рекламные документы (unknownpromotionid1, unknownpromotionid2 и т.д.), Не зная бизнес-идентификаторов (unknownbusinessid1, unknownbusinessid2, unknownbusinessid3 и т.д.)

это должно быть что-то вроде этого:

 const getItem = db.doc(`BUSINESS/$whatever`).collection("PROMOTIONS")
    .get().then((snapshot) => {

        snapshot.docs.map(doc => {
            console.log("this is your promotion", doc)
        })

    return promotionsArray
})
  

как это можно сделать?
Спасибо!

Комментарии:

1. Вы не можете сделать это с помощью одного запроса. Вам придется запрашивать каждую вложенную коллекцию по отдельности, чтобы получить все документы.

Ответ №1:

Вы можете использовать запрос группы коллекций, как описано в документах, он позволяет получать доступ к вложенным коллекциям с определенным именем из всех документов одновременно:

 db.collectionGroup('PROMOTIONS').get().then(snapshot => {
  snapshot.forEach(doc => {
    console.log("this is your promotion", doc)
   }
});
  

Обратите внимание, что вам нужно будет установить индекс, а также соответствующее правило безопасности для Firestore:

 match /{path=**}/PROMOTIONS/{id} {
  allow read: if true;
}
  

Комментарии:

1. Потрясающе, спасибо! Куда мне добавить правило безопасности? (извините, если это очевидно, все еще учусь)

2. будет ли это в консоли firestore таким образом? rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { match /{document=**} { allow read, write; } match /{path=**}/PROMOTIONS/{id} { allow read: if true; } } }

3. Отлично, вы нашли его! Вы можете написать свои правила либо в файле firestore.rules, либо непосредственно в консоли Firebase.

4. Ваше правило выглядит хорошо для меня, вы можете проверить с помощью игровой площадки правил в консоли.