Firestore collectionReference返回所有文档

时间:2020-03-30 09:26:36

标签: java android firebase google-cloud-firestore

我正在使用Firebase Firestore查询某些具有特定ID的文档。这是我的结构:

编辑:此行之后添加了屏幕快照和说明:

generatedIdid的值相同。我有这些“ id”的列表,我想搜索public_messages集合以返回我提供的“ id”列表的项目列表。

firestore structure

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的数量可以超过10(这显然是Google设置的限制,也是我试图通过使用for循环规避的限制)。我该怎么办?

2 个答案:

答案 0 :(得分:1)

解决此问题的关键是使用Tasks的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()触发时,您将确保已获得所有文档。

答案 1 :(得分:0)

尝试以下

CollectionReference collectionReference =

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

collectionReference.get().addOnCompleteListener(..);