我正在使用Firebase Firestore查询某些具有特定ID的文档。这是我的结构:
编辑:此行之后添加了屏幕快照和说明:
generatedId
和id
的值相同。我有这些“ id”的列表,我想搜索public_messages
集合以返回我提供的“ id”列表的项目列表。
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循环规避的限制)。我该怎么办?
答案 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(..);