Первое замечание: this.db.collection('users').doc(user.uid).collection('Details')
- это , а не запрос группы коллекций, но операция чтения для одной коллекции.
Похоже, вы хотите проверить, является ли коллекция Details
под пользовательским документом содержится документ с termsOfAgreement
, равным true. Проще всего проверить это с помощью:
firebase.firestore()
.collection('users').doc(user.uid)
.collection('Details').where('termsOfAgreement', '==', true).limit(1)
.get().then((querySnapshot) => {
if (querySnapshot.empty == false) {
this.router.navigate(['terms']);
} else {
this.router.navigate(['dashboard']);
}
})
Приведенный выше код использует обычный JavaScript SDK, поскольку для этой операции нет необходимости использовать AngularFire. Но кроме этого, он будет работать одинаково в любом из них: вы запускаете запрос к коллекции и затем проверяете, есть ли какие-либо результаты.
В дополнение к исправлению вашего кода это также оптимизирует его двумя способами:
- Запрос отправляется на сервер, поэтому вы передаете только те данные, которые соответствуют условию.
- Передается не более одного документа, поскольку вас заботит только результат существует.
Я не уверен, почему вы храните termsOfAgreement
во вложенной коллекции.
Если вы проверяете наличие любого поддокумента, где termsOfAgreement
имеет значение true, вы можете рассмотреть возможность добавления поля termsOfAgreement
в сам пользовательский документ, так что вам не нужно выполнить запрос по вложенной коллекции.
Вы установили бы для этого userDoc.termsOfAgreement
значение true, как только пользователь примет какие-либо термины во вложенной коллекции, и тогда больше не придется запрашивать вложенную коллекцию (упрощение кода чтения и сокращение количества операций чтения).