如何在Firestore中构建集合的子节点?

时间:2017-10-11 09:07:18

标签: firebase google-cloud-firestore

我正在尝试将以下结构从实时数据库迁移到Firestore:

•   Resources
    o   SENT
           resId1
               •    name : xxxx
               •    url : xxx
           resI2
               •    name ……
   o    ACCEPT
           resId3
           etc……
   o    REFUSED
           restIdn 
           etc….

所以在根节点“资源”下我有一些包含资源项列表的子节点(SENT,ACCEPT,REFUSED,...)。

使用Firestore似乎我不能直接在集合下使用subCollection(当我尝试在管理控制台中使用Firestore重现此结构时,我需要创建一个中间文档,如:

Collection --> document --> SubCollection --> documents

女巫导致了这种结构:

Resources --> SENT --> SENT --> resId1 {name: xxx, url: yyyy}

因此子节点“SENT”被复制两次(一个用于文档,一个用于子集合)。 如果我与firebase实时数据库进行比较,这根本不是改进或简化 我错过了什么吗?这种数据库结构的最佳方法是什么?

1 个答案:

答案 0 :(得分:3)

(编辑于10月13日上午11点)

似乎有两种结构对你有用。

选项1:三个根集合

在Firestore数据库的根目录下创建三个集合

  • resources-sent
  • resources-accept
  • resources-refused

每个都包含文件。

选项2:一个根集合

Firestore允许进行复合查询,因此您只需在名为resources的根目录中创建一个集合,并在typetype之一的每个文档中添加[sent, accept, refused]参数}。

然后你可以做这样的查询:

// Get all sent resources
db.collection("resources").where("type", "==", "sent").get()

由于Firestore内置了索引,因此查询总是很快!'

选项3:子集合。

创建一个名为resources的根集合,其中只包含三个文档:

  • sent
  • accept
  • refused

对于这些文档中的每一个,都要创建一个resources子集合。

所以要获得所有发送的资源:

// Get all sent resources
db.collection("resources").doc("sent").collection("resources").get()