Firestore collectionReferenceは、すべての文書を返します。

ウスマン:

私は、特定のIDを持ついくつかの文書を照会するFirebase Firestoreを使用しています。これは私の構造体です:

EDIT:THIS LINE AFTERスクリーンショットと説明ADDED JUST:

generatedIdそして、id同じ値を持っています。私は、これらの「ID」のリストを持っていると私は検索したいpublic_messages私の「ID」のリストを提供する項目のリストを返すようにコレクションを。

firestore構造

root
----- public_messages
---------- generatedId
-------------------- name
-------------------- id  
---------- generatedId
-------------------- name
-------------------- id  
----- other data

私は、特定のIDを持つメッセージを照会するには、次のコードを使用しています:

 ArrayList<String> keys ... (this has some keys)

    CollectionReference collectionReference = firebaseFirestore.collection("public_messages");

    for (String id : keys) {
        collectionReference.whereEqualTo("id", id);
    }

    collectionReference.get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
        @Override
        public void onComplete(@NonNull Task<QuerySnapshot> task) {
            if (task.isSuccessful()) {
                int count = 0;
                for (QueryDocumentSnapshot document : task.getResult()) {
                    count++;
                }
                loog("total messages = " + count);
            } else {
                Log.d("TAG", "Error getting documents: ", task.getException());
            }
        }
    });

ではonComplete、変数、task.getResult()リターンのすべての文書は、コレクション言いました。その結果、変数はcount言ったコレクション内のドキュメントの合計数を表します。

私は指定されたIDを持つ結果を照会します。IDの数は、(明らかにGoogleによる制限設定され、かつIは、forループ使用して回避しようとしていた制限)10を超えることができます。私は何をすべきか?

アレックス・マモ:

この問題を解決する鍵は、作業者の使用することですwhenAllSuccess(コレクション>タスク)

指定されたすべてのタスクが正常に完了したときに正常に完了タスクの結果のリストを返しタスクを。

次のコード行のように:

CollectionReference collectionReference = FirebaseFirestore.getInstance().collection("public_messages");
ArrayList<String> ids = new ArrayList<>(); //Contains your keys
ArrayList<Task<QuerySnapshot>> tasks = new ArrayList<>();
for (String id : ids) {
    Task<QuerySnapshot> task = collectionReference.whereEqualTo("id", id).get();
    tasks.add(task);
}

Tasks.whenAllSuccess(tasks).addOnSuccessListener(new OnSuccessListener<List<Object>>() {
    @Override
    public void onSuccess(List<Object> list) {
        //Do what you need to do with your list
        for (Object object : list) {
            PublicMessage publicMessage = ((DocumentSnapshot) object).toObject(PublicMessage.class);
        }
        Log.d("TAG", "Finished getting all " + list.size() + " documents");
    }
});

ときonSuccess()火災は、あなたは絶対にすべての文書を持っていることを確認してくださいます。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=367336&siteId=1