2

WriteBatchを作成して、自分のデータベース内の私のダイナミックな参照のコントロールを維持しようとしています。私のアプリは単純なUser-Follow-Post-Feedモデルを持っています。ここでは、自分のフィード内で、自分がフォローしているすべてのユーザーの投稿を見ることができます。私はFirebaseの例題(Firefeedとして)とStackOverflowの投稿で多くの研究をしています。Firestoreデータベースで一度に500を超える操作を実行します

最適なアイデアは、自分のフィードに表示する投稿のIdsを保存するパス(この場合はcollection)を保持することです。つまり、コピーを制御して、すべてのユーザーのすべての投稿を削除します追従/追放。

私はこれを原子的な方法で保つために私のCloud functionsを作成しましたが、すべてうまくいきましたが、大規模なテストをしようとすると、ユーザーに5000件以上の投稿を追加して多くの時間がCloud functionになると思います)、バッチには500回の操作制限があることがわかりました。だから私がやったことは、私の5000のIDを複数の小さなリストに分割し、リストごとに1つのバッチを実行し、決して500の限界を超えないようにすることです。

でも、このようにしても、バッチが同時に実行されているか、理由がわからないというエラーが表示されます。I can't do more than 500 operations in a single commit多分、私は連続して一度に実行しないでください。しかし、私はまだそれにいくつかの問題を抱えています。それが私の質問の理由です。誰かが私に手を差し伸べることができるようになりますことを

fun updateFeedAfterUserfollow(postIds: QuerySnapshot, userId: String) { 
     //If there is no posts from the followed user, return 
     if (postIds.isEmpty) return 
     val listOfPostsId = postIds.map { it.id } 
     val mapOfInfo = postIds.map { it.id to it.toObject(PublicUserData::class.java) }.toMap() 

     //Get User ref 
     val ref = firestore.collection(PRIVATE_USER_DATA).document(userId).collection(FEED) 
     //Split the list in multiple list to avoid the max 500 operations per batch 
     val idsPartition = Lists.partition(listOfPostsId, 400) 

     //Create a batch with max 400 operations and execute it until the whole list have been updated 
     idsPartition.forEach { Ids -> 
      val batch = firestore.batch().also { batch -> 
       Ids.forEach { id -> batch.set(ref.document(id), mapOfInfo[id]!!) } 
      } 
      batch.commit().addOnCompleteListener { 
       if (it.isSuccessful) 
        Grove.d { "Commit updated successfully" } 
       else Grove.d { "Commit fail" } 
      } 
     } 
    } 

希望:

は、ここに私の方法です。 ありがとうございました!

+0

あなたが得るエラーメッセージは何ですか? –

+0

あなたの最終的な解決策は何ですか? – 22Ryann

答えて

1

最後に、このバッチ操作をトランザクション内で実現しようとしていたため、問題が発生しました。これは最後にバッチのように機能します。だから私は400の参照ごとにバッチを生成していましたが、このインスタンスはトランザクション内で作成され、500の制限を超える単一の大きなトランザクションのようにカウントされます。私はいくつかの変更を加え、私のgithubのリポジトリに実装しました。

//Generate the right amount of batches 
    const batches = _.chunk(updateReferences, MAX_BATCH_SIZE) 
     .map(dataRefs => { 
      const writeBatch = firestoreInstance.batch(); 
      dataRefs.forEach(ref => { 
       writeBatch.update(ref, 'author', newAuthor); 
      }); 
      return writeBatch.commit(); 
     }); 

それはtypescriptです上writedされていますが、確かにそれを理解します: https://github.com/FrangSierra/firestore-cloud-functions-typescript/blob/master/functions/src/atomic-operations/index.ts

関連する問題