태그 보관물: firebase

firebase

Google Firestore-한 번의 왕복으로 여러 ID로 문서를 가져 오는 방법은 무엇입니까? Firestore 로의 한 번의 왕복

Firestore 로의 한 번의 왕복 (네트워크 호출)으로 ID 목록으로 여러 문서를 가져올 수 있는지 궁금합니다.



답변

Node 내에있는 경우 :

https://github.com/googleapis/nodejs-firestore/blob/master/dev/src/index.ts#L701

/**
* Retrieves multiple documents from Firestore.
*
* @param {...DocumentReference} documents - The document references
* to receive.
* @returns {Promise<Array.<DocumentSnapshot>>} A Promise that
* contains an array with the resulting document snapshots.
*
* @example
* let documentRef1 = firestore.doc('col/doc1');
* let documentRef2 = firestore.doc('col/doc2');
*
* firestore.getAll(documentRef1, documentRef2).then(docs => {
*   console.log(`First document: ${JSON.stringify(docs[0])}`);
*   console.log(`Second document: ${JSON.stringify(docs[1])}`);
* });
*/

이것은 특히 서버 SDK 용입니다.

업데이트 :
“Cloud Firestore [클라이언트 측 SDK]가 이제 IN 쿼리를 지원합니다!”

https://firebase.googleblog.com/2019/11/cloud-firestore-now-supports-in-queries.html

myCollection.where(firestore.FieldPath.documentId(), 'in', ["123","456","789"])


답변

방금 https://firebase.googleblog.com/2019/11/cloud-firestore-now-supports-in-queries.html 이 기능을 발표했습니다 .

이제 다음과 같은 쿼리를 사용할 수 있지만 입력 크기는 10보다 클 수 없습니다.

userCollection.where('uid', 'in', ["1231","222","2131"])


답변

아니요, 현재 Cloud Firestore SDK를 사용하여 여러 읽기 요청을 일괄 처리 할 수있는 방법이 없으므로 모든 데이터를 한 번에 읽을 수 있다고 보장 할 방법이 없습니다.

그러나 Frank van Puffelen이 위의 주석에서 말했듯이 이것은 3 개의 문서를 가져 오는 것이 하나의 문서를 가져 오는 것보다 3 배 느리다는 것을 의미하지는 않습니다. 여기서 결론에 도달하기 전에 직접 측정을 수행하는 것이 가장 좋습니다.


답변

실제로는 다음과 같이 firestore.getAll을 사용합니다.

async getUsers({userIds}) {
    const refs = userIds.map(id => this.firestore.doc(`users/${id}`))
    const users = await this.firestore.getAll(...refs)
    console.log(users.map(doc => doc.data()))
}

또는 약속 구문으로

getUsers({userIds}) {
    const refs = userIds.map(id => this.firestore.doc(`users/${id}`))
    this.firestore.getAll(...refs).then(users => console.log(users.map(doc => doc.data())))
}


답변

다음과 같은 함수를 사용할 수 있습니다.

function getById (path, ids) {
  return firestore.getAll(
    [].concat(ids).map(id => firestore.doc(`${path}/${id}`))
  )
}

단일 ID로 호출 할 수 있습니다.

getById('collection', 'some_id')

또는 ID 배열 :

getById('collection', ['some_id', 'some_other_id'])


답변

이를 수행하는 가장 좋은 방법은 Cloud Function에서 Firestore의 실제 쿼리를 구현하는 것입니다. 그러면 클라이언트에서 Firebase로 단 한 번의 왕복 호출이 발생하며 이는 귀하가 요청하는 것 같습니다.

어쨌든이 서버 측과 같은 모든 데이터 액세스 논리를 유지하고 싶습니다.

내부적으로 Firebase 자체에 대해 동일한 수의 호출이있을 수 있지만 모두 외부 네트워크가 아닌 Google의 초고속 상호 연결을 통해 이루어지며 Frank van Puffelen이 설명한 파이프 라이닝과 결합되어 뛰어난 성능을 얻을 수 있습니다. 이 접근법.


답변

flutter를 사용하는 경우 다음을 수행 할 수 있습니다.

Firestore.instance.collection('your collection name').where(FieldPath.documentId, whereIn:[list containing multiple document IDs]).getDocuments();

이것은 List<DocumentSnapshot>당신이 적합하다고 느끼는대로 반복 할 수 있는 Future를 반환 할 것입니다.