Firestore:查询android中数组中的所有元素

我有一个类似的数据结构

/Split // Collection {authid} // Document /SentIvitation //Collection {auto-id} //Documnet amount //array 0:10 1:10 2:10 Phonenumbers//array 0:987654321 1:123456789 2:234567890 

我需要查询电话号码中的所有元素,我必须检查这些电话号码是否已经存在于另一个集合中。 我的数据结构的下一个路径是

 /deyaUsers //Collection {authid}. //Documnet Name: "abc" Email: "abc@gmail.com" Phonenumber:987654321 

在没有任何索引的情况下可以在firestore中使用吗?

如在官方文件中 :

虽然Cloud Firestore可以存储数组, it does not support查询数组成员或更新单个数组元素。

如果你只想获得整个papers数组,你需要迭代这样的Map

 Map map = documentSnapshot.getData(); for (Map.Entry entry : map.entrySet()) { if (entry.getKey().equals("Phonenumbers")) { Log.d("TAG", entry.getValue().toString()); } } 

但请注意,即使Phonenumbers对象作为数组存储在数据库中, entry.getValue()返回ArrayList ,而不是array

只有在使用多个属性查询数据库时才需要使用索引。 但不是你的情况。

如果您考虑这种替代数据库结构,其中每个电话号码是地图中的关键字并且所有值都为真,则更好的方法是:

 Phonenumbers: { "987654321": true, "123456789": true, "234567890": true } 

编辑2018年8月13日:

根据有关数组成员资格的更新文档,现在可以使用whereArrayContains()方法基于数​​组值过滤数据。 一个简单的例子是:

 CollectionReference citiesRef = db.collection("cities"); citiesRef.whereArrayContains("regions", "west_coast"); 

此查询返回每个城市文档,其中regions字段是包含west_coast的数组。 如果数组具有您查询的值的多个实例,则文档仅包含在结果中一次。

您需要具有以下查询:

当您从集合查询文档然后从文档中收集时。

说明:

如果父节点为"Split"首先获取"Split" collection然后根据"authid"可以有多个文档 ,因此您将根据currentUser(已登录的用户,从FirebaseAuth获取)获取文档。

根据authId获取特定用户的document ,您将从authId document获取该特定用户集合的"SendInvitations"

码:

 CurrentUser currentUser = FirebaseAuth.getCurrentUser(); firestore.collection("Split").document(currentUser.getUid()).collection("SendInvitation") .get() .addOnCompleteListener(new OnCompleteListener() { @Override public void onComplete(@NonNull Task task) { if (task.isSuccessful()) { //Handle Success } else { //Handle Error } } }); 

根据结构,这将是查询。

希望能帮助到你。