Firestore collectionReference возвращает все документы - PullRequest
0 голосов
/ 30 марта 2020

Я использую Firebase Firestore для запроса некоторых документов с определенным идентификатором. Это моя структура:

РЕДАКТИРОВАТЬ: СКРИНШОТ И ОПИСАНИЕ, ДОБАВЛЕННЫЕ ТОЛЬКО ПОСЛЕ ЭТОЙ ЛИНИИ:

generatedId и id имеют одинаковое значение. У меня есть список этих «идентификаторов», и я хочу выполнить поиск в коллекции public_messages, чтобы получить список элементов, которые мне предоставил список «идентификаторов».

firestore structure

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

Я использую следующий код для запроса сообщений с определенным идентификатором:

 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 представляет общее количество документов в указанной коллекции.

Я хочу запрашивать результаты только с указанными идентификаторами. Количество идентификаторов может превышать 10 (это, по-видимому, ограничение, установленное Google, и ограничение, которое я пытался обойти, используя for-l oop). Что мне делать?

Ответы [ 2 ]

1 голос
/ 30 марта 2020

Ключом к решению этой проблемы является использование Tasks's whenAllSuccess (Collection> tasks) :

Возвращает задачу со списком результатов задачи, которая успешно завершается, когда все указанные задачи успешно завершены.

Как и в следующих строках кода:

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(), вы будете уверены, что получили абсолютно все документы.

0 голосов
/ 30 марта 2020

Попробуйте следующее

CollectionReference collectionReference =

firebaseFirestore.collection("public_messages").whereIn("id", keys);

collectionReference.get().addOnCompleteListener(..);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...