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" }
}
}
}
希望:
は、ここに私の方法です。 ありがとうございました!
あなたが得るエラーメッセージは何ですか? –
あなたの最終的な解決策は何ですか? – 22Ryann