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 } } });
根据结构,这将是查询。
希望能帮助到你。