首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在多个字段上包含Fi还原使用

在多个字段上包含Fi还原使用
EN

Stack Overflow用户
提问于 2018-11-01 05:56:15
回答 1查看 4.7K关注 0票数 0

我有一个即将推出的电子游戏应用程序。游戏发布可以在多个平台上发布。我听说,在如何检索数据方面,防火墙比firebase实时数据库灵活得多。我被困在如何检查我的游戏发布文档在我的发布集合中是否包含用户选择的平台,所以这个应用程序可以显示游戏在他的平台上出来。

这就是我现在所拥有的

platforms是一个包含平台ids的整数列表。

代码语言:javascript
复制
  databaseReference.collection(getRegionNode())
            .whereEqualTo("m_y", monthFilter)
            .whereArrayContains("platforms", platforms)
            .orderBy("date", Query.Direction.ASCENDING).get().addOnCompleteListener(listener);

下面是一个游戏发布文档的示例:

代码语言:javascript
复制
   1369: { 
        "src": "Images/dead.png",
        "name": "red dead 2",
        "date": 2018-10-26,
        "region": worldwide,
        "platforms": "[12, 13, 54]"
    }

比方说,用户只想看到平台12和13的游戏,我想要一个查询来检查和检索12和13在他们的平台列表中的所有版本文档。谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-11-01 06:44:52

固定恢复查询的whereArrayContains(字符串字段,对象值)

创建并返回带有附加筛选器的新查询,即文档必须包含指定字段,值必须是数组,数组必须包含提供的值。

根据您的注释,作为该方法的第二个参数传递的platforms对象的类型为array。实际上,您正在platforms属性中搜索数组类型的数组,这是不可能的,因为数据库中的平台数组包含数字:

代码语言:javascript
复制
"platforms": "[12, 13, 54]"

不是数组。这样的查询:

代码语言:javascript
复制
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()方法调用。我知道这听起来有点奇怪,但这就是的工作原理。

您的模式应该如下所示:

代码语言:javascript
复制
1369: { 
    "src": "Images/dead.png",
    "name": "red dead 2",
    "date": 2018-10-26,
    "region": worldwide,
    "platformsOne": 12,
    "platformsTwo": 13,
    "platformsThree": 54
}

要查找平台121354的所有游戏,您应该使用如下所示的查询:

代码语言:javascript
复制
FirebaseFirestore rootRef = FirebaseFirestore.getInstance();
Query query = rootRef.
    .whereEqualTo("platformsOne", 12)
    .whereEqualTo("platformsTwo", 13)
    .whereEqualTo("platformsThree", 54);
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53095871

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档