【问题标题】:Firestore use contains on multiple fieldsFirestore 使用包含多个字段
【发布时间】:2018-11-01 05:56:15
【问题描述】:

我有一个即将推出的视频游戏应用。一个游戏版本可以在多个平台上发布。我听说在如何检索数据方面,firestore 比 firebase 实时数据库灵活得多。我不知道如何检查我的发布集合中的游戏发布文档是否包含用户选择的平台,以便应用程序可以显示在他的平台上发布的游戏。

这是我目前拥有的

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

  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 在他们的平台 列表。谢谢!

【问题讨论】:

  • .whereArrayContains("platforms", platforms) 传入的第二个参数的值是多少?
  • 平台ID整数列表
  • 你能给我一个具体的例子吗?
  • 我当前的平台列表包含平台 12 和 13
  • platforms.add(12) 和platforms.add(13)

标签: android google-cloud-firestore


【解决方案1】:

Firestore 查询的whereArrayContains(String field, Object value)

创建并返回一个带有附加过滤器的新查询,该过滤器文档必须包含指定的字段,值必须是一个数组,并且该数组必须包含提供的值。

根据您的 cmets,作为第二个参数传递给此方法的 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。有关如何创建索引,请参阅我的回答 post

即使您使用上述查询,您也可以只使用一个whereArrayContains() 方法调用来过滤您的项目。如果要使用多个,会出现以下错误:

原因:java.lang.IllegalArgumentException:无效查询。查询仅支持具有单个包含数组的过滤器。

如果您需要在多个平台上进行过滤,则需要通过为您拥有的每个单独平台创建一个属性并链接whereEqualTo() 方法调用来更改构建数据库的逻辑。我知道这听起来有点奇怪,但这就是 Cloud Firestore 的工作原理。

你的架构应该是这样的:

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

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

FirebaseFirestore rootRef = FirebaseFirestore.getInstance();
Query query = rootRef.
    .whereEqualTo("platformsOne", 12)
    .whereEqualTo("platformsTwo", 13)
    .whereEqualTo("platformsThree", 54);

【讨论】:

  • 谢谢!今天晚些时候我会试试这个!
  • 我也可以这样做 stackoverflow.com/questions/46687714/… 不是吗?你觉得哪个更好?
  • 是的,你可以。两者都被认为更好,但您可以按照自己喜欢的方式进行操作。
猜你喜欢
  • 2019-03-21
  • 1970-01-01
  • 2011-04-20
  • 1970-01-01
  • 2020-12-22
  • 1970-01-01
  • 2020-07-14
  • 2019-10-25
相关资源
最近更新 更多