Как выбрать несколько ссылок на документы в одном запросе? - PullRequest
1 голос
/ 14 июня 2019

У меня есть две коллекции Firestore, одна называется parents, а другая - children. Эти коллекции «связаны» тем, что parents имеет массив child ссылок на документы, прикрепленных к ним.

Что я хочу сделать, это: Получить все children, которые «связаны» с одним parent быстрым способом.

Что я пробовал: Я придумал этот код, который прекрасно работает функционально:

this.subscription = this.props.firebase.parent().onSnapshot((parent) => { // get a single parent

    let childrenPromises = (parent.data().children || []).map(child => this.props.firebase.child(child.id).get()); // build array of promises

    Promise.all(childPromises) // resolve all promises
        .then(children => {
            // children.data() has the data I need :)
        });
});

Подводя итог: Я получаю список child ссылок на документы, а затем, используя обещания, извлекаю их все по отдельности. Это прекрасно работает, но бомбардирует мою базу данных запросами.

Что я хочу улучшить: Можно ли как-то реорганизовать это в один, более производительный запрос? В идеале это был бы один запрос, чтобы предотвратить столько запросов к БД.

Что я пробовал: Я прочитал все документы Firestore и сообщения о переполнении стека, которые мне не удалось найти без удачи. Я читал, что отмена нормализации БД - это вариант, но я бы предпочел этого не делать, поскольку несколько parents могут быть привязаны к children.

Любая помощь или совет здесь приветствуется. Спасибо!

1 Ответ

1 голос
/ 14 июня 2019

Нет, невозможно запросить коллекции с разными именами в одном запросе. Операции типа "соединение" не существует.

То, что вы делаете сейчас, на самом деле не «бомбардирует» Firestore. Он создан для того, чтобы не отставать от многих операций чтения документов, и все запросы передаются по конвейеру через одно соединение. На самом деле здесь нет проблем с производительностью или масштабируемостью, если только вы не запрашиваете больше данных, чем вам нужно. На самом деле, Cloud Firestore просто не позволит вам делать что-либо, что не масштабируется. Все индексированные операции масштабируются.

...