Java Firebase查询或';ing WHEREQUALTO中列出了可能的值

Java Firebase查询或';ing WHEREQUALTO中列出了可能的值,java,android,firebase,google-cloud-firestore,Java,Android,Firebase,Google Cloud Firestore,我发现这不再适用于Firebase Cloud Firestore 我想做一个查询,对照一个潜在值列表检查文档字段的值,比如whereEqualTo(someField,a或b或c或…或n)。具体来说,我有一个引用类型的单个字段的潜在值列表,我希望我的查询返回指定集合中的所有文档,这些文档的字段值等于列表中的一个潜在值。我还使用了.limit(10),因为我正在分页数据 因此,例如,如果我的列表包含引用[ref1,ref2,ref3],那么查询将类似于连接这3个查询: 查询query1=mDat

我发现这不再适用于Firebase Cloud Firestore

我想做一个查询,对照一个潜在值列表检查文档字段的值,比如
whereEqualTo(someField,a或b或c或…或n)
。具体来说,我有一个引用类型的单个字段的潜在值列表,我希望我的查询返回指定集合中的所有文档,这些文档的字段值等于列表中的一个潜在值。我还使用了
.limit(10)
,因为我正在分页数据

因此,例如,如果我的列表包含引用[ref1,ref2,ref3],那么查询将类似于连接这3个查询:

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

在“限制”一节中,它提到:

逻辑OR查询。在这种情况下,您应该为每个OR条件创建一个单独的查询,并在应用程序中合并查询结果。

因此,也许最好的方法是合并查询结果,但如何做到这一点,并且限制为10个结果

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

我想做一个查询,对照一个潜在值列表检查文档字段的值

不幸的是,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!");
                }
            }
        }
    }
});
FirebaseFirestore rootRef=FirebaseFirestore.getInstance();
CollectionReference myCollectionRef=rootRef.collection(“myCollection”);
myCollectionRef.get().addOnCompleteListener(新的OnCompleteListener(){
@凌驾
未完成的公共void(@NonNull任务){
if(task.issusccessful()){
List yourList=new ArrayList();
对于(QueryDocumentSnapshot文档:task.getResult()){
DocumentReference=document.getDocumentReference(“refField”);
String stringReference=reference.getPath();
if(yourList.contains(stringReference)){
Log.d(标记“找到引用!”);
}
}
}
}
});
我假设您的列表包含字符串类型的文档引用。如您所见,我们需要通过使用
getPath()
方法来获取描述文档在数据库中位置的字符串,从而序列化从数据库中获取的
DocumentReference
对象。要将该路径字符串反序列化回
DocumentReference
对象,请使用方法


另外,如果您对分页感兴趣,是通过将查询游标与limit()方法相结合来对查询进行分页的方法。我还建议您看看这个,以便更好地理解。

我的问题是,它获取并循环收集中的每个文档。因此,如果集合中有大量文档不包含其中一个引用,则在第一个文档包含其中一个引用之前,可能需要很长时间才能找到引用。基本上是O(n),如果n表示文档的数量很大,这将很慢,无法达到使用查询的目的。外接程序分页,每次获取更多文档时都会乘以此值。这是不正确的。上面的代码只是一个示例。如果您正在使用分页,正如您所说的那样,您不会查询整个数据库,那么您将使用limit()方法来帮助您防止这种情况。这就是为什么要使用分页来加载较小数据块中的数据。即使你想查询整个数据库,记住Firestore会自动伸缩,对吗?看,还有一件事需要注意,一位Firebase工程师说,我引用他的话,“在Firestore中构建一个缓慢的查询是不可能的”。因此,性能来自新的索引功能。所以不要担心可伸缩性。即使我使用limit(10)方法,如果有1000个文档,并且只有最后一个文档有引用,我也需要进行100次查询,每次在我到达带有引用的文档之前循环遍历所有10个文档。Firestore的索引功能不会有帮助,因为它不知道我正在寻找客户机上的特定参考,对吗?因此,尽管每获取10个文档不是一个“慢”查询,但它仍然很慢,因为它必须执行100次,并在客户端上循环每10个文档。因此,最坏情况下的运行时与我获取每个文档的运行时相同。之所以如此缓慢,是因为它没有限制通过whereEqualTo或类似的方式在查询过程中获取的文档(我正试图这样做)。