如何根据另一个集合中存储的数组过滤Firestore中的文档?

时间:2019-07-01 16:33:31

标签: java android firebase google-cloud-firestore

我有一个这样组织的Firestore数据库:

FirestoreDB FireStore DB

我有三个片段显示:所有帖子,用户关注的个人帖子以及用户的所有帖子。我的问题是要获得用户关注的个人的职位,而其他两个则要工作。

我以前曾尝试从Firestore获取该数组,并使用该数组查询关注的用户的帖子,但是我无法按如下所述访问生成该数组的方法之外的数组:https://firebase.google.com/docs/firestore/query-data/get-data#get_a_document

像这样:

DocumentReference docRef = db.collection("following").document(currentUser.getUid());
        docRef.get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
            @Override
            public void onComplete(@NonNull Task<DocumentSnapshot> task) {
                if (task.isSuccessful()) {
                    DocumentSnapshot document = task.getResult();
                    if (document.exists()) {
                        List<String> group = (List<String>) document.get("following");
                    } else {
                    }
                } else {
                }
            }
        });

Query posts = db.collection("posts").whereEqualTo("userId", group);//Does not compile since cannot resolve group.

然后在其中使用DocumentSnapshot创建数组的位置,但是由于查询不在方法的范围内,因此无法使用创建的数组。

我目前无法使用的内容如下:

Query posts = db.collection("posts").whereEqualTo("userId", FirebaseFirestore.getInstance()
                .collection("following")
                .document(currentUser.getUid()));

感谢您提供的任何帮助。

最后一期

private void readData(MyCallback callback){
        DocumentReference docRef = db.collection("following").document(currentUser.getUid());
        docRef.get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
            @Override
            public void onComplete(@NonNull Task<QuerySnapshot> task) {
                if (task.isSuccessful()) {
                    for (DocumentSnapshot document : Objects.requireNonNull(task.getResult())){
                        String group = document.getString("following");
                        followingList.add(group);
                    }
                    callback.onCallback(followingList);//says must be declared final
                } else {
                }
            }
        });
    }

1 个答案:

答案 0 :(得分:2)

您的代码中存在两个主要问题。第一个将在以下代码行中:

Query posts = db.collection("posts").whereEqualTo("userId", group);

group对象不在其定义的范围内,因此这就是编译错误的原因。除此之外,您无法传递whereEqualTo()方法作为列表的第二个参数。如果要为数组中的每个用户创建一个新查询,则应对其进行迭代,并将String作为第二个参数传递。

第二个问题是onComplete()具有异步行为。即使您将列表创建为全局变量,也无法使用,因为该方法会立即返回,而您尝试在group方法之外使用的onDataChange()列表的值将尚未从回调中填充。

该问题的快速解决方案是将上述代码行移至onComplete()方法内,并传递一个String和 not 列表,否则,建议您看最后一部分我的 post 中的答案,其中我解释了如何使用自定义回调来完成。您也可以查看此 video 以获得更好的理解。