# #angular #typescript #google-cloud-firestore
Вопрос:
У меня есть коллекция под названием «Врачи». В коллекции есть два документа: UYykRWfzzUMrztZqvOEZ и eYOBnRuqKe3rGLM1nmoC. Только первый документ имеет подколлекцию обзоров.
Я пытался таким образом:
component.html: `
//component.ts
@Component({
selector: 'app-search',
templateUrl: './search.component.html',
styleUrls: ['./search.component.css']
})
export class SearchComponent implements OnInit {
Doctors: Doctor[];
Reviews: Review[];
colectie: any;
constructor(private doctorService: DoctorInfoService, private reviewService: ReviewService, private act: ActivatedRoute, private db : AngularFirestore) { }
ngOnInit(): void {
const id = this.act.snapshot.paramMap.get('id');
this.doctorService.getDoctorList()
.subscribe(e => {
this.Doctors = e.map(e => {
return {
doctorID: e.payload.doc.id,
...e.payload.doc.data() as Doctor
}
})
})
this.reviewService.getReviewInfo(id)
.subscribe(e => {
this.Doctors = e.map(e => {
return {
doctorID: e.payload.doc.id,
...e.payload.doc.data() as Doctor
}
})
})
}
showReviews: boolean = false;
getDoctorReviews() {
this.showReviews = true;
}
hideDoctorReviews() {
this.showReviews = false;
}
}
//reviewService.ts that query the DB
import { Injectable } from '@angular/core';
import { AngularFirestore } from '@angular/fire/firestore';
@Injectable({
providedIn: 'root'
})
export class ReviewService {
constructor(private db: AngularFirestore) { }
getDoctorID(){
this.db
.collection('doctors')
}
getReviewInfo(id) {
return this.db
.collection('doctors/' id 'reviews')
.snapshotChanges();
}
}
<!--component.html -->
<body>
<div *ngFor="let doctor of Doctors; let i = index" class="row">
<div class="column">
<div class="card bg-light mb-3" style="width: 18rem;">
<div class="card-body">
<h5 class="card-text">{{ doctor.name }}</h5>
<h6 class="card-text">{{ doctor.category }}</h6>
<p class="card-text">Rating : </p>
<button class='btn btn-primary' (click)="getDoctorReviews()">Show Reviews</button>
<button class='btn btn-secondary' (click)="hideDoctorReviews()">Hide</button>
</div>
</div>
</div>
<div *ngIf="showReviews" class="column">
<div class="card bg-light mb-3" style="width: 18rem;">
<div *ngFor="let review of Reviews; let i = index" class="row">
<div class="card-body">
<h5 class="card-text">{{ review.doctorName }}</h5>
<p class="card-text">Rating : {{ review.rating }}</p>
<p class="card-text">{{ review.userName }}</p>
<p class="card-text">{{ review.message }}</p>
</div>
</div>
</div>
</div>
</div>
</body>
Я знаю, что путь к коллекции отзывов —
«врачи» docID «отзывы»
но я слишком много дней блокировал отображение вложенной коллекции отзывов только для соответствующего документа, который ее содержит(«UYykRWfzzUMrztZqvOEZ»-> доктор Джеймс Смит).
Мой ожидаемый результат должен быть таким:
Одна из проблем заключается в том, что в component.ts строка
идентификатор const = this.act.snapshot.paramMap.get(‘идентификатор’); возвращает значение null, и я не нашел способа это сделать. Я также попытался отправить документ с component.html в component.ts, но и здесь мне это не удалось.
Любой совет или мнение очень полезны для меня. Спасибо
Ответ №1:
Модель «многие ко многим» не идеальна для чтения в Firestore, поскольку Firestore не извлекает вложенные коллекции для каждого документа. Если ваша цель состоит в том, чтобы просто просмотреть все отзывы или ограничить их, было бы лучше просто получить все отзывы врачей .limit(x)
x
, чтобы быть вашими максимальными документами для чтения.
citiesRef.orderBy("created").limit(3);
Ключевым фактором является то, что на вас не влияет чтение, когда подколлекция не существует
Источники: https://firebase.google.com/docs/firestore/query-data/order-limit-data