【问题标题】:How to get documents in which object contains key in Firestore?如何获取其中对象包含 Firestore 中的键的文档?
【发布时间】:2018-11-05 11:54:30
【问题描述】:

我正在使用 Firestore 和 Angularfire2 创建一个 Ionic 应用程序。

我的数据库结构如下:

- creators
  - CREATOR_ID
    - name (string)
    - description (string)
    - posts (map)
      - category1 (array)
        - [POST1, POST2, POST3]
      - category2 (array)
        - [POST3, POST4, ...]

创建者可以创建帖子/文章。当创作者创建文章时,他可以指定该帖子属于哪些类别!

关于应用程序的问题是,当用户想要按类别过滤时,它会将包含至少一个帖子的所有 CREATORS 都包含在用户选择的类别中(而不是带来该类别中的所有文章)。

所以,根据上面的结构,我尝试了以下方法:

this.afs.collection<Creator>('creators', ref => ref.where("posts.category1", '>', ""));

但它什么也没返回!

你们有什么建议吗?

谢谢!

【问题讨论】:

    标签: ionic3 google-cloud-firestore angularfire2


    【解决方案1】:

    正如我在您的数据库架构中看到的,您的 category1category2 是数组。以下where()函数调用:

    .where("posts.category1", '>', "POST1")
    

    如果您的类别(category1category2)的类型是 Map 而不是数组,并且您将被查询特定帖子,那么将会工作。为了解决这个问题,有两种方法:

    第一个是更改类别的类型,从 array -> map 并使用上面的行代码,第二个是使用:

    .where("posts.category1", , "array-contains", "POST1")
    

    但请注意,以上方法都不能帮助您确定数组是否包含至少一个元素。为此,您应该添加一个侦听器并检查该特定数组/映射是否存在。

    更多信息请参见here

    【讨论】:

    • 嗨,亚历克斯,感谢您的帮助!不幸的是,我不是在寻找一个帖子。我正在寻找在帖子地图中具有特定键的所有创建者。因此,如果我正在寻找 category1,我希望所有在帖子地图中拥有键“category1”的创建者。您提到了听众..您的意思是,获取所有创建者,然后在我的应用程序中一一检查创建者是否在“帖子”中有该类别?
    • “我正在寻找所有在帖子地图中具有特定键的创建者。”在您的情况下,您应该考虑通过创建一个posts 集合来增加您的数据结构以允许反向查找,您应该将创建者拥有的每个帖子添加为文档(rootRef -&gt; posts(collection)-&gt;creatorId(document)-&gt;creatorPosts(collection)-&gt;postId(document))。您也可以看看我的回答,post 以获得更好的理解。
    • 谢谢!那我会尝试改变我的数据结构!最后一个问题,如果您不介意的话:假设我有一组 ID,例如 [POST_ID1, POST_ID2, POST_ID3, ...]。如果我遍历这些 IDS 中的每一个(例如,使用 forEach 循环)并从另一个集合(如 rootRef 中的“posts”集合)请求发布数据本身,我是否会为数组中的每个 ID 付费(如,每个 ID 都是对数据库的一次调用)?还是将其视为对所有 id 的 Firestore 数据库的一次调用?
    • 如果你有一个 id 数组,只要你遵守每个文档 1Mib 的限制,其中有多少个 id 都没有关系。因此,如果您读取的文档具有具有 100 个 id 的数组类型属性,则您需要为单次读取操作付费。如果您使用这 100 个 id 再进行 100 次数据库调用,则需要为新的 100 次读取操作付费。你也可以看看我这个 post 的回答。
    • 知道了!谢谢你的帮助,亚历克斯!
    猜你喜欢
    • 1970-01-01
    • 2023-04-02
    • 2021-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-21
    • 2020-06-10
    • 2018-07-01
    相关资源
    最近更新 更多