如何在具有未知字段的子对象数组上使用whereToEqual

时间:2018-05-05 13:44:02

标签: java android firebase google-cloud-firestore

让我向您展示Firestore文档结构。

enter image description here

如何比较stops数组值?因为出发时每个条目的时间12:00 PM会有所不同。

所以实际上我希望获得buss的值,其中我的给定值与stops数组的任何值匹配。

2 个答案:

答案 0 :(得分:1)

根据@Frank van Puffelen的回答,因为Firestore不支持查询数组成员,所以应该考虑稍微改变一下数据库结构。因此,您应该使用maps而不是使用数组。因此,在每个文档中,您需要添加一个map,如下所示:

Firestore-root
   |
   --- buses (collection)
        |
        --- busId (document)
              |
              --- buss: "/buss/OdGpiY..."
              |
              --- stops (map)
                    |
                    --- IQdng...526MpZ: true
                    |
                    --- pnwJ...4P3ef: true

正如您所看到的,我在总线文档中添加了一个名为stops的新映射,其中包含键,站点名称和布尔值true。使用此数据库结构,您可以根据地图中存在的元素查询数据库,如下所示:

FirebaseFirestore rootRef = FirebaseFirestore.getInstance();
CollectionReference busesRef = rootRef.collection("buses");
Query query = busesRef.whereEqualTo("stops.IQdng...526MpZ", true);

答案 1 :(得分:0)

来自Firestore documentation on arrays

  

虽然Cloud Firestore可以存储数组,但它不支持查询数组成员或更新单个数组元素。

要允许查询包含特定停靠点的路径,您应该在文档中存储一个包含停靠点的附加字段:

stops
  IQdng...526MpZ: true

现在您可以通过执行以下操作查询具有该停靠点的路线:

routesRef.whereEqualTo("stops.IQdng...526MpZ", true)

您也需要原始结构停止,因为这是了解停靠顺序和每次停止时间的唯一方法。