Firestore 컬렉션의 모든 데이터 수를 얻는 방법
Firestore : 모든 데이터 수를 얻는 방법
페이지 네이션에 필요한, Firestore 컬렉션의 모든 데이터 건수 취득. 데이터 크기에 따라 획득 방법을 변경하는 것이 좋습니다 (성능에 영향).
아래에 방법.
수백건 정도의 경우
데이터를 로컬로 로드하고 카운트합니다.
import { AngularFirestore, AngularFirestoreCollection } from '@angular/fire/firestore';
import { Observable } from 'rxjs';
constructor(
private db: AngularFirestore,
) {}
ngOnInit() {
}
length: number; // 全件数を格納する変数
// commentsコレクションの全データ件数を獲得しlengthに保存
getDataSize() {
this.db.collection('comments').valueChanges().subscribe( values => {
console.log('■データ数は、' + values.length);
this.length = values.length
})
}
그리고 이 함수를 ngOnInit() {..}에 돌진해 두면 된다.
ngOnInit() {
this.getDataSize();
}
수천 건의 경우
Cloud Functions를 이용해 그곳에서 카운트시킨다.
Functions의 이용 방법은 여기 으로.
functions/src/index.ts 편집
코드는 다음과 같습니다.
import * as functions from 'firebase-functions';
import * as admin from 'firebase-admin';
import * as rp from 'request-promise';
// firebase の初期化
admin.initializeApp(functions.config().firebase)
const fireStore = admin.firestore()
// commentsコレクションのデータ数カウント
exports.countComments = functions.https.onRequest((req, res) => {
let commentsfaqsRef = fireStore.collection('commentsfaqs');
commentsfaqsRef.get().then( snap => {
res.header('Access-Control-Allow-Origin', "*");
res.header('Access-Control-Allow-Headers', "Origin, X-Requested-With, Content-Type, Accept");
res.status(200).send({length: snap.size});
})
.catch(error => {
res.send( error() );
});
});
res.header('Access-Control-Allow-Origin', "*");
res.header('Access-Control-Allow-Headers', "Origin, X-Requested-With, Content-Type, Accept");
두 줄을 붙이지 않으면 CORS 관련 오류가 발생합니다.
이런 느낌의 에러 메시지↓
Access to fetch at 'https://<your-project>.cloudfunctions.net/<your-function>'
from origin 'http://localhost:3000' has been blocked by CORS policy:
Response to preflight request doesn't pass access control check:
No 'Access-Control-Allow-Origin' header is present on the requested resource.
If an opaque response serves your needs,
set the request's mode to 'no-cors' to fetch the resource with CORS disabled.
firebase deploy
그러면 해당 기능만 배포한다.
$ firebase deploy --only functions:countComments
아래와 같이 countComments 함수만 배포되고 완료 전에 Function URL이 표시되므로 삼가해 둔다.
…略…
i functions: uploading functions in project: countComments(us-central1)
i functions: creating Node.js 8 function countComments(us-central1)...
+ functions[countComments(us-central1)]: Successful create operation.
Function URL (countComments): https://us-central1-projectName.cloudfunctions.net/countComments
Deploy complete!
낙서에 URL에 액세스하면,
카운트 된 데이터 수가 표시됩니다.
클라이언트 측에서 REST 클라이언트 구현
그리고는 countComments가 토출한 데이터 건수를 클라이언트측(Angular)으로 페치 하는 것만. HttpClientModule을 사용합니다.
import { AngularFirestore, AngularFirestoreCollection } from '@angular/fire/firestore';
import { Observable } from 'rxjs';
constructor(
private db: AngularFirestore,
) {}
ngOnInit() {
}
length: number; // 全件数を格納する変数
// commentsコレクションの全データ件数を獲得しlengthに保存
getDataSize() {
this.db.collection('comments').valueChanges().subscribe( values => {
console.log('■データ数は、' + values.length);
this.length = values.length
})
}
ngOnInit() {
this.getDataSize();
}
import * as functions from 'firebase-functions';
import * as admin from 'firebase-admin';
import * as rp from 'request-promise';
// firebase の初期化
admin.initializeApp(functions.config().firebase)
const fireStore = admin.firestore()
// commentsコレクションのデータ数カウント
exports.countComments = functions.https.onRequest((req, res) => {
let commentsfaqsRef = fireStore.collection('commentsfaqs');
commentsfaqsRef.get().then( snap => {
res.header('Access-Control-Allow-Origin', "*");
res.header('Access-Control-Allow-Headers', "Origin, X-Requested-With, Content-Type, Accept");
res.status(200).send({length: snap.size});
})
.catch(error => {
res.send( error() );
});
});
Access to fetch at 'https://<your-project>.cloudfunctions.net/<your-function>'
from origin 'http://localhost:3000' has been blocked by CORS policy:
Response to preflight request doesn't pass access control check:
No 'Access-Control-Allow-Origin' header is present on the requested resource.
If an opaque response serves your needs,
set the request's mode to 'no-cors' to fetch the resource with CORS disabled.
$ firebase deploy --only functions:countComments
…略…
i functions: uploading functions in project: countComments(us-central1)
i functions: creating Node.js 8 function countComments(us-central1)...
+ functions[countComments(us-central1)]: Successful create operation.
Function URL (countComments): https://us-central1-projectName.cloudfunctions.net/countComments
Deploy complete!
import { HttpClientModule } from '@angular/common/http';
imports: [
HttpClientModule,
]
import { HttpClient } from '@angular/common/http';
constructor(
private httpClient: HttpClient,
) {}
ngOnInit() {
this.getDataSize();
}
countCommentsURL : string = 'https://us-central1-projectName.cloudfunctions.net/countComments' // function 'countComments'のURL
length: number; // 全件数を格納する変数
// commentsコレクションの全データ件数を獲得しlengthに保存
async getDataSize() {
this.httpClient.get(this.countCommentsURL)
.toPromise()
.then((res) => {
const response: any = res;
this.length = response.length
})
.catch((error) =>
console.log(error)
);
}
1만건 이상의 경우
To Be Continue…
참고:
[Angular] HTTP 클라이언트(REST 클라이언트) 구현
Firebase의 Cloud Functions에서 CORS가 ~라든지 Access-Control-Allow-Origin이 ~라고 말하면
Google Cloud Functions에서 cors 사용
Reference
이 문제에 관하여(Firestore 컬렉션의 모든 데이터 수를 얻는 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/atomyah/items/f94b279febccca030896텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)