Cloud Firestore의 실시간 업데이트로 초기 상태의 added 이벤트 발화로 인한 요금 청구 방지

소개


  • Firebase의 Cloud Firestore를 어느 정도 만지는 방향의 내용이므로 기본적인 설명은 생략합니다.
  • 샘플 코드는 JavaScript이므로, 다른 언어의 SDK를 사용하시는 분은 적절하게 읽어 주세요.

  • 공식 문서에도 나타나지 않았고 구그가 좀처럼 나오지 않는 정보이기 때문에 누군가가 도움이되면 감사하겠습니다.

    무엇을 해결하고 싶습니까?



    ref. htps : // 푹 빠져라. 오, ぇ. 코 m / cs / 푹신 s 잡아 / 쿠 ry-data / ぃ s 텐

    Cloud Firestore에서 실시간 업데이트를 받을 때 다음과 같이 아무것도 생각하지 않고 지금까지 모든 문서를 검색하면 저장된 모든 데이터에 대해 added 이벤트가 발화됩니다.
    // チャットアプリなどで messages コレクションのドキュメントスナップショットを取得する例
    firebase
      .firestore()
      .collection("messages")
      .orderBy("createdAt", "desc")
      .onSnapshot(snapshot => {
        snapshot.docChanges().forEach(change => {
          if (change.type === "added") {
            // 保存済みのデータ n 件分出力される
            console.log("New message:", change.doc.data());
          }
        });
      });
    

    ref. htps : // 푹 빠져라. 오, ぇ. 코 m / 드 cs / 푹신 s 잡아 / 쿠에 ry-data / ぃ s 텐 # ぃ え w_

    첫 번째 쿼리 스냅샷에는 쿼리와 일치하는 모든 기존 문서의 added 이벤트가 포함됩니다. 이는 쿼리의 초기 상태에 대한 쿼리 스냅샷이 최신 상태가 되도록 일련의 변경 사항을 얻었기 때문입니다.

    이것의 무엇이 문제인가 하면, added 이벤트 1회에 대해 1회의 독해로서 카운트되어 버리므로, 엄청 낭비적인 비용이 걸려 버립니다.

    ref. htps : // 푹 빠져라. 오, ぇ. 코 m / 드 cs / 후레 s

    쿼리 결과를 수신하는 경우 결과 집합에 문서를 추가하거나 업데이트할 때마다 한 번의 읽기로 청구됩니다.

    해결 방법



    위의 채팅 앱의 예라면 스냅샷으로 이전 최신 메시지의 저장 시간보다 새로운 메시지만 가져오도록 하면 됩니다.

    ※ Firestore 의 Timestamp 형과 JavaScript 의 Date 형을 비교하기 위해서는 fromDate() 메소드를 사용해 형 변환해 줄 필요가 있습니다.
    // チャットアプリなどで messages コレクションのドキュメントスナップショットを取得する例
    firebase
      .firestore()
      .collection("messages")
      .orderBy("createdAt", "desc")
      .where(
        "createdAt",
        ">",
        // 変数 lastCreatedAt には Date 型の値を渡してあげてください
        // See. https://firebase.google.com/docs/reference/js/firebase.firestore.Timestamp.html#fromdate
        firebase.firestore.Timestamp.fromDate(lastCreatedAt)
      )
      .onSnapshot(snapshot => {
        snapshot.docChanges().forEach(change => {
          if (change.type === "added") {
            // 新しく追加されたデータのみ出力される
            console.log("New message:", change.doc.data());
          }
        });
      });
    

    참고


  • How to skip initial data and trigger only new updates in Firestore Firebase? - Stack Overflow
  • Convert date to timestamp for storing into firebase firestore in javascript - Stack Overflow
  • 좋은 웹페이지 즐겨찾기