Java Firestore:在android中查询数组中的所有元素
我有一个数据结构,比如Java Firestore:在android中查询数组中的所有元素,java,android,firebase,google-cloud-firestore,Java,Android,Firebase,Google Cloud Firestore,我有一个数据结构,比如 /Split // Collection {authid} // Document /SentIvitation //Collection {auto-id} //Documnet amount //array 0:10 1:10 2:10 Phonenumbers//array
/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中是否可以不使用任何索引?您需要有如下查询: 当您从一个集合查询到另一个文档,然后从文档查询集合时 说明:
CurrentUser currentUser = FirebaseAuth.getCurrentUser();
firestore.collection("Split").document(currentUser.getUid()).collection("SendInvitation")
.get()
.addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
@Override
public void onComplete(@NonNull Task<DocumentSnapshot> task) {
if (task.isSuccessful()) {
//Handle Success
} else {
//Handle Error
}
}
});
父节点为“拆分”
时,首先获取“拆分”集合
,然后根据“authid”
可以有多个文档,因此您将根据当前用户(已登录的用户,从FirebaseAuth
获取)获取文档
根据authId
获取特定用户的文档
后,您将从authId文档
中获取该特定用户集合的“发送邀请”
代码:
CurrentUser currentUser = FirebaseAuth.getCurrentUser();
firestore.collection("Split").document(currentUser.getUid()).collection("SendInvitation")
.get()
.addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
@Override
public void onComplete(@NonNull Task<DocumentSnapshot> task) {
if (task.isSuccessful()) {
//Handle Success
} else {
//Handle Error
}
}
});
CurrentUser CurrentUser=FirebaseAuth.getCurrentUser();
firestore.collection(“拆分”).document(currentUser.getUid()).collection(“发送邀请”)
.get()
.addOnCompleteListener(新的OnCompleteListener(){
@凌驾
未完成的公共void(@NonNull任务){
if(task.issusccessful()){
//成功
}否则{
//处理错误
}
}
});
根据结构,这将是一个查询
希望有帮助。如:
尽管Cloud Firestore可以存储数组,但它不支持查询数组成员或更新单个数组元素
如果您只想获得整个论文
数组,则需要在地图
上迭代,如下所示:
Map<String, Object> map = documentSnapshot.getData();
for (Map.Entry<String, Object> entry : map.entrySet()) {
if (entry.getKey().equals("Phonenumbers")) {
Log.d("TAG", entry.getValue().toString());
}
}
编辑2018年8月13日:
CurrentUser currentUser = FirebaseAuth.getCurrentUser();
firestore.collection("Split").document(currentUser.getUid()).collection("SendInvitation")
.get()
.addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
@Override
public void onComplete(@NonNull Task<DocumentSnapshot> task) {
if (task.isSuccessful()) {
//Handle Success
} else {
//Handle Error
}
}
});
根据更新的文档,现在可以使用whererraycontains()
方法基于数组值过滤数据。一个简单的例子是:
CollectionReference citiesRef = db.collection("cities");
citiesRef.whereArrayContains("regions", "west_coast");
此查询返回每个城市文档,其中regions字段是包含west_coast的数组。如果数组中有您查询的值的多个实例,则结果中只包含一次文档
我现在已经编辑了我的问题“我需要如何编写查询”该查询仍将使用更新结构。您能解释一下吗请检查答案此处我只需要电话号码字段有一个备用路径为了检查这些电话号码是否存在于另一个集合中,首先您需要获取它们。但这在云Firestore中是不可能的。您无法查询数组成员。那么您可以说如何将电话号码数组存储到firestore中,因为abouve requirementphone号码在一个长数组中。在我的例子中,987654321是值。我们可以使用它作为文件名并获取它。是的,这是另一种结构,其中电话号码将是
地图中的键。