Firebase查询Or'ing whereEqualTo以获取可能值的列表

时间:2018-07-13 19:58:52

标签: java android firebase google-cloud-firestore

我已经看到this question before for an earlier version of Firebase不再适用于Firebase Cloud Firestore。

我想进行一个查询,以将文档字段的值与潜在值列表进行比较,例如whereEqualTo(someField, a OR b OR c OR ... OR n)。具体来说,我有一个引用类型为单个字段的潜在值列表,并且我希望查询返回指定集合中其字段值等于列表中潜在值之一的所有文档。我也在使用.limit(10),因为我正在分页数据。

例如,如果我的列表包含引用[ref1,ref2,ref3],则查询将类似于加入这三个查询:

查询query1 = mDatabase.collection(“ myCollection”)。whereEqualTo(“ refField”,ref1);
查询query2 = mDatabase.collection(“ myCollection”)。whereEqualTo(“ refField”,ref2);
查询query3 = mDatabase.collection(“ myCollection”)。whereEqualTo(“ refField”,ref3);

documentation的“限制”部分下,它提到:

Logical OR queries. In this case, you should create a separate query for each OR condition and merge the query results in your app.

所以也许最好的方法是合并查询结果,但是如何做到这一点,并限制10个结果呢?

请注意,我正在使用Java进行Android开发。

1 个答案:

答案 0 :(得分:0)

  

我想进行查询,以对照潜在值列表检查文档字段的值。

不幸的是,Firestore中没有查询可以帮助您实现这一目标。相反,您可以做的是获取myCollection集合下的所有文档,并根据如下所示的潜在值列表检查所需的文档字段的值:

FirebaseFirestore rootRef = FirebaseFirestore.getInstance();
CollectionReference myCollectionRef = rootRef.collection("myCollection");
myCollectionRef.get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
    @Override
    public void onComplete(@NonNull Task<QuerySnapshot> task) {
        if (task.isSuccessful()) {
            List<String> yourList = new ArrayList<>();
            for (QueryDocumentSnapshot document : task.getResult()) {
                DocumentReference reference = document.getDocumentReference("refField");
                String stringReference = reference.getPath();
                if (yourList.contains(stringReference)) {
                    Log.d(TAG, "Reference found!");
                }
            }
        }
    }
});

我假设您的列表包含String类型的文档引用。如您所见,我们需要使用DocumentReference方法来序列化从数据库中获取的getPath()对象,以获取描述文档在数据库中位置的字符串。要将路径String反序列化为DocumentReference对象,请使用FirebaseFirestore.getInstance().document(path)方法。

PS。如果您对分页感兴趣,可以使用 this 通过将查询游标与limit()方法结合使用来对查询进行分页。我还建议您查看此 video ,以更好地理解。