android - 您可以在 Firestore 中的一个查询中链接多个 whereEqualTo 操作吗
问题描述
在我的应用程序中,我有一个多选对话框,其中包含用户应该能够选择的各种过滤器选项,以便根据rarity
文档的字段过滤数据库。由于过滤器对话框中有许多选项,如果我们考虑过滤器的所有可能组合,手动覆盖每个案例将需要很长时间。考虑到这一点,我尝试创建一个起始查询,如下所示,然后我遍历用户选择的过滤器列表,并尝试whereEqualTo("rarity",filter)
为每个过滤器的查询添加一个操作。我注意到你不能像普通变量那样连接查询,var i += 5
所以我想知道这种问题是否有任何解决方案。您实际上可以 在步骤/片段中在同一查询中应用多个whereEqualTo
操作吗 不覆盖先前对同一查询应用的操作?
这是我在收到用户在我的 FilterActivity.kt 类中选择的过滤器后尝试的方法:
class FilterActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_filter)
val db = FirebaseFirestore.getInstance()
val filters:ArrayList<String>? = intent.getStringArrayListExtra("filterOptions")
Log.d("FilterActivity", "filter options $filters")
var query = db.collection("Cards").orderBy("resID")
for(filter in filters!!) {
query = query.whereEqualTo("rarity",filter)
}
query.get().addOnSuccessListener { querySnapshot ->
if(querySnapshot.isEmpty) Log.d("FilterActivity","is empty")
for(doc in querySnapshot.documents) {
Log.d("FilterActivity", "${doc.getString("name")} - ${doc.getString("rarity")}")
}
}
}
}
解决方案
基本上,您正在尝试执行OR操作,在其中检索所有文档,其中稀有字段与数组中的任何值匹配。
您正在尝试新的firebase whereIn操作,您可以在其中传递值数组,但过滤器中最多10 个值的限制
FirebaseFirestore.getInstance()
.collection("Cards")
.orderBy("resID")
.whereIn("rarity",filters!!.toList())
.get().addOnSuccessListener { querySnapshot ->
if (querySnapshot.isEmpty) Log.d("FilterActivity", "is empty")
for (doc in querySnapshot.documents) {
Log.d("FilterActivity", "${doc.getString("name")} - ${doc.getString("rarity")}")
}
}
过滤器数组列表最多可以包含 10 个值
推荐阅读
- mongodb - 添加小时到日期 JASPERsoft Studio/ 添加小时到 mongodb 查询日期
- sql-server - 更改 SQL Server 中的列数据类型
- python - FileNotFoundError: [WinError 3] 系统找不到指定的路径:'./cogs'
- javascript - 如何使图像在鼠标后面平滑移动
- groovy - Soap UI 断言:内容与正则表达式格式不匹配
- android - Dialog.dismiss 在适配器类中不起作用
- pine-script - 在 pine 脚本中绘制/绘制预计股票价格的最佳方法是什么?
- flutter - context != null': 在scaffold.dart 中不正确
- .net - 如何使用 GitHub Action 和 .NETCore 增加 NuGet 版本
- javascript - 计算嵌套数组中的相同数据不起作用