这是我第一次使用Firestore。我有一个名为users
的集合,其中每个用户都是UID,每个用户都有字段(姓名、电话和联系人(数组))。我想获取所有用户,其中存储在用户联系人字段中的任何号码都存在于他们的电话字段中。我试着从文档中学习,但现在对我来说太高级了。
我正在使用Kotlin和Jetpack撰写Android应用程序。
collection(users)
->documents (all users for eg: sd3f3fvv3ac)
- name:""
- phone:1234
- contacts: array(all phone numbers)
所以我想要所有电话号码在我所引用的当前文档/用户的联系人数组中的用户/文档。
我想要类似于我们在SQL中所做的。
select * from users where phone IN (select contacts from users where user_id = {current user})
。这是控制台
的屏幕截图val citiesRef = db.collection("users")
citiesRef.whereArrayContains("contacts", phone).get()
.addOnSuccessListener { result ->
//read data
}
.addOnFailureListener {
//erormessage
}
}
使用此代码,将列出与您在电话部分中填写的电话号码相同的联系人。
您不可能一次只获得在contacts
数组中有其电话号码的用户。因此,您必须查询users
集合两次,一次获取电话号码,第二次验证该号码是否存在于数组中。所以下面的代码行就可以了:
val db = Firebase.firestore
val usersRef = db.collection("users")
usersRef.get().addOnCompleteListener { usersTask ->
if (usersTask.isSuccessful) {
for (userDoc in usersTask.result) {
val phone = userDoc.getString("phone")
phone?.let {
usersRef.whereArrayContains("contacts", phone).get().addOnCompleteListener {
if (it.isSuccessful) {
for (doc in it.result) {
val name = doc.getString("name")
Log.d(TAG,"$name")
}
}
}
}
}
}
}
logcat中的结果将是将其电话号码添加到contacts
数组的所有用户的名称。
公立小学我看到你正在尝试使用Jetpack Compose来构建你的应用程序,在这种情况下,我建议你阅读下面的文章,我解释了如何在干净的架构中做到这一点:
- 如何显示数据从Firestore使用Jetpack撰写?