我有一个即将推出的电子游戏应用程序。游戏发布可以在多个平台上发布。我听说,在如何检索数据方面,防火墙比firebase实时数据库灵活得多。我被困在如何检查我的游戏发布文档在我的发布集合中是否包含用户选择的平台,所以这个应用程序可以显示游戏在他的平台上出来。
这就是我现在所拥有的
platforms是一个包含平台ids的整数列表。
databaseReference.collection(getRegionNode())
.whereEqualTo("m_y", monthFilter)
.whereArrayContains("platforms", platforms)
.orderBy("date", Query.Direction.ASCENDING).get().addOnCompleteListener(listener);下面是一个游戏发布文档的示例:
1369: {
"src": "Images/dead.png",
"name": "red dead 2",
"date": 2018-10-26,
"region": worldwide,
"platforms": "[12, 13, 54]"
}比方说,用户只想看到平台12和13的游戏,我想要一个查询来检查和检索12和13在他们的平台列表中的所有版本文档。谢谢!
发布于 2018-11-01 06:44:52
固定恢复查询的whereArrayContains(字符串字段,对象值)
创建并返回带有附加筛选器的新查询,即文档必须包含指定字段,值必须是数组,数组必须包含提供的值。
根据您的注释,作为该方法的第二个参数传递的platforms对象的类型为array。实际上,您正在platforms属性中搜索数组类型的数组,这是不可能的,因为数据库中的平台数组包含数字:
"platforms": "[12, 13, 54]"不是数组。这样的查询:
databaseReference.collection(getRegionNode())
.whereEqualTo("m_y", monthFilter)
.whereArrayContains("platforms", 12) //Passed a number as the second argument
.orderBy("date", Query.Direction.ASCENDING).get().addOnCompleteListener(listener);将很好地工作,因为我们正在platforms数组中搜索一个数字。还请注意,如果您打算使用此查询王,则需要一个index。有关如何创建索引,请参阅此帖子的答案。
即使使用上述查询,也只能使用一个whereArrayContains()方法调用来筛选项。如果要使用多个,则会发生以下错误:
由: java.lang.IllegalArgumentException:无效查询引起。查询只支持有一个数组-包含过滤器。
如果需要在多个平台上进行筛选,则需要更改构造数据库的逻辑,方法是为所拥有的每个平台创建一个属性,并链接whereEqualTo()方法调用。我知道这听起来有点奇怪,但这就是的工作原理。
您的模式应该如下所示:
1369: {
"src": "Images/dead.png",
"name": "red dead 2",
"date": 2018-10-26,
"region": worldwide,
"platformsOne": 12,
"platformsTwo": 13,
"platformsThree": 54
}要查找平台12、13和54的所有游戏,您应该使用如下所示的查询:
FirebaseFirestore rootRef = FirebaseFirestore.getInstance();
Query query = rootRef.
.whereEqualTo("platformsOne", 12)
.whereEqualTo("platformsTwo", 13)
.whereEqualTo("platformsThree", 54);https://stackoverflow.com/questions/53095871
复制相似问题