私はFirestoreデータベース内のユーザーの電子メールのリストとユーザーの電話の連絡先の電子メールのリストを比較してから、「contactsInApp」の新しいリストを作成します。このFirestoreクエリループのパフォーマンスをどのように高速化できますか?電話連絡先リストをFirestoreデータベースと照合する
まず、Firestoreデータベースのユーザー全員を取得します。その後、各ユーザーごとにforEachループを作成し、私の電話連絡先リスト内の各連絡先を一致するかどうかチェックします。一致するものがあれば、 "androidContactsInApp"の新しいリストを作成します。少人数のユーザーでもうまく動作しますが、5,000ユーザーでテストした場合、30秒ほどという時間がかかります。私は、ファイアストアがうまくスケールされると考えていたので、自分のコードに問題があるかどうか疑問に思っていました。私はまた、ループを反転しようとしている
fsDB.collection("users")
.get().addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
@Override
public void onSuccess(QuerySnapshot documentSnapshots) {
for (DocumentSnapshot document : documentSnapshots) {
String userEmail = document.get("email").toString();
for (UserInfoForRequest android_contact: arrayListAndroidContacts) {
String isEmailInDatabase = android_contact.getUserEmail();
String trimmedEmail = isEmailInDatabase.trim();
if (userEmail.equals(trimmedEmail)) {
String userID = document.getId();
UserInfoForRequest android_contact2 = new UserInfoForRequest();
android_contact2.setUserName(document.get("username").toString());
android_contact2.setUserEmail(userEmail);
android_contact2.setCurrentUID(currentUID);
android_contact2.setContactsUID(userID);
arrayListAndroidContactsInApp.add(android_contact2);
}
}
}
adapterWithApp.notifyDataSetChanged();
adapterNoApp.notifyDataSetChanged();
}
});
:
は、ここに私のコードです。そうすることで、私は各連絡先を私の電話連絡先一覧に入れ、各電話連絡先の問い合わせを実行します。これは私がユーザーのコレクション全体をダウンロードしていないことを意味します。この方法はずっと遅く、多くの人が遅くなります。私は別々の個別のクエリを実行するためだと思います。ここに私のコードは次のとおりです。
for (final UserInfoForRequest android_contact: arrayListAndroidContacts) {
String contactsEmail = android_contact.getUserEmail();
String trimmedEmail = contactsEmail.trim();
fsDB.collection("users").whereEqualTo("email", trimmedEmail).get().addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
@Override
public void onSuccess(QuerySnapshot documentSnapshots) {
if (documentSnapshots.isEmpty()) {
Log.d("FOUNDEMAIL", " document is empty ");
}
else {
List list = documentSnapshots.getDocuments();
DocumentSnapshot doc = (DocumentSnapshot) list.get(0);
UserInfoForRequest android_contact2 = new UserInfoForRequest();
android_contact2.setUserName(doc.get("username").toString());
android_contact2.setUserEmail(doc.get("email").toString());
android_contact2.setCurrentUID(currentUID);
android_contact2.setContactsUID(doc.getId());
arrayListAndroidContactsInApp.add(android_contact2);
adapterWithApp.notifyDataSetChanged();
adapterNoApp.notifyDataSetChanged();
}
}
})
編集:[OK]をので、私はいくつかのテストをしました。 .getを使用する代わりに "Snapshot Listener"を使用した場合、27.5秒から23.5秒に短縮されたドキュメントスナップショットを取得するのに4秒間を節約できました。また、ループ自体が4秒しかかかっていないことが判明しました。文書の取得には19時間かかります。
その後、5,000人のユーザーを削除し、1,000人のユーザーでテストしました。 1,000人のユーザーの読み込み時間は6.5秒で、ループ自体は6.5秒です。 1秒。このことをスピードアップするためには、ファイアーベースで対処する必要があるのは単なる問題ですか?
こんにちは@Jeffは、あなたの検索を高速化することができます。どんな解決策ですか? –
はい、私は以下の答えを投稿します、ありがとう。 –