【问题标题】:Firestore: How to query data from a map of an arrayFirestore:如何从数组的映射中查询数据
【发布时间】:2019-07-03 04:44:34
【问题描述】:

这是测试数据库的架构:

我想编写一个查询,该查询可以获取联系人在任何数组索引中的 id=1 的所有文档。

我已经检查了 array_contains 操作员的 firestore,但问题是我的数组有地图,然后有字段 id。

谢谢

【问题讨论】:

  • 您知道如何查询 id/name 级别的属性吗?我遇到了同样的问题。

标签: firebase google-cloud-firestore


【解决方案1】:

您目前无法构建在数组中查找对象字段的查询。您可以在数组中找到的唯一内容是数组元素的全部内容,而不是元素的一部分。

对于 NoSQL 类型的数据库,通常的做法是以适合您查询的方式构建数据。因此,在您的情况下,您将不得不构造数据以让您找到数组项包含特定字符串的文档。因此,您可以创建另一个仅包含您要查询的字符串的数组。您必须确保这些数组保持最新。

您也可以在这里重新考虑使用数组。数组适用于位置数据,但除非这些联系人需要按特定顺序存储,否则您可能希望存储一个其键为 id 且其字段数据还包含 id 和名称的对象。

【讨论】:

  • 感谢@Doug Stevenson - 正是我想要的。澄清一下-不可能根据地图的键进行查询,对吗? (即唯一的方法是创建一个仅包含这些键的单独数组)
  • 或者一个单独的对象,其中的键映射到真/假之类的东西。
  • @DougStevenson 出于兴趣,考虑到您仍然无法根据地图的键进行查询,将其转换为一个有什么好处?无论哪种方式,您都需要保持同步的附加 ID 数组。除非您当然可以预见需要持续时间查找。
【解决方案2】:

正如道格所说,你不能查询它, 但是,如果您可以将数据结构化为类似于this

  1. 将您的数据存储为地图
  2. 使用id 作为键,name 作为值
  3. 现在你可以写一个查询来获取联系人拥有id=1的所有文档
db.collection("test").where("contacts.1", ">=", "").get()

【讨论】:

    【解决方案3】:

    正如@Doug 所说,One soulions 将数组添加到您需要查询的数据中,并使其保持最新状态。

    另一种解决方案是将联系人作为文档的子集合,然后您可以查询联系人并获取其父级。

    final Query contacts = db.collectionGroup("contacts").whereEqualTo("id", 1);
    for (DocumentSnapshot document : querySnapshot.get().getDocuments()) {
      System.out.println(document.getId());
      System.out.println(document.getString("parent_id"));
    }
    

    如果您不想将父级添加为另一个字段,可以从父级参考中获取,查看此答案https://stackoverflow.com/a/56223319/1278463

    snapshot.getRef().getParent().getParent().collection("people")
    

    https://firebase.google.com/docs/firestore/query-data/queries#collection-group-query

    【讨论】:

      【解决方案4】:

      如果您有一组地图或对象,并且想要像这样获取包含此特定地图/对象的文档? array_of_maps.png

      你可以使用

      queryForCategory(categName: string, categAlias: string): Observable[] {
          firestore.collection('<Collection name>', ref =>
      
              ref.where('categories',
                "array-contains", {
                  "alias": categAlias,
                  "title": categName
                }

      【讨论】:

        猜你喜欢
        • 2021-06-07
        • 2022-10-23
        • 2022-01-01
        • 2021-10-27
        • 1970-01-01
        • 2021-02-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多