基于标签的过滤实现Firestore

时间:2020-05-01 16:53:30

标签: java firebase google-cloud-firestore

我有一个集合,其中有一个名为categories的字段。其中包含对象["cat1", "cat2", "cat3", "cat4", "cat5", "cat6", "cat7", "cat8", "cat9", "cat10", cat11 ]的数组。(数组中超过10个类别)。

当尝试执行whereArrayContainsAny时会出现错误INVALID_ARGUMENT: A maximum of 10 'IN' or 'ARRAY_CONTAINS_ANY' filter values are allowed at once.,因此我将无法采用该数组。然后我读了一些文章,他们说要维护数据图,例如,

catagories
  |_cat1 : true
  |_cat2 : false
  |_cat3 : false

如果使用此方法,是否会出现性能问题?当类别超过10个时,是否可以使用相同的现有数组方法进行此过滤?

我尝试过的是

Firestore db = FIRConnection.initFIRConnection();

// Create a reference to the cities collection
CollectionReference deliveries = db.collection("data");

// Create a query against the collection.
Query query = deliveries.whereArrayContainsAny("categories", Arrays.asList("cat1",
                "cat2", "cat3", "cat4", "cat5", "cat6", "cat7", "cat8", "cat9", "cat10", "cat11"));

// retrieve  query results asynchronously using query.get()
ApiFuture<QuerySnapshot> querySnapshot = query.get();

for (DocumentSnapshot document : querySnapshot.get().getDocuments()) {
    System.out.println(document.get("categories"));
}

1 个答案:

答案 0 :(得分:0)

使用此选择会遇到的问题是Firestore doesn't support logical OR queries among multiple fields。如果您想知道是否在文档上设置了N个类别的任何,则必须在客户端上分别查询每个 N个类别。那可能不是您想要的,因为您可能会为每个查询多次阅读文档。

最好将类别列表分成10个批次,使用arrayContainsAny分别查询每个批次,然后在客户端上合并每个查询的结果。