【问题标题】:Firebase - unable to nest a collection of collectionFirebase - 无法嵌套集合集合
【发布时间】:2019-04-03 22:09:50
【问题描述】:

在我的 React Native 项目中,我使用 Firestore 作为我的数据库。每当用户注册时,我都想创建一个主管批准请求。

基本上在supervisorRequests 的集合下,每个supervisor 都应该有一个文档,以主管的密钥命名。在主管文档下,我希望拥有一组随机生成的 id,每个 id 都包含请求元数据。这是我想要的结构:

-supervisorRequests
      -supervisor-1-Key
           -random-id-of-request
              - user: userID
              - userEmail: userEmail
              - requestDate: timestamp
           -random-id-of-request
              - user: userID
              - userEmail: userEmail
              - requestDate: timestamp
      -supervisor-2-Key
           -random-id-of-request
              - user: userID
              - userEmail: userEmail
              - requestDate: timestamp
           -random-id-of-request
              - user: userID
              - userEmail: userEmail
              - requestDate: timestamp
           -random-id-of-request
              - user: userID
              - userEmail: userEmail
              - requestDate: timestamp

我试图实现这一点的代码是:

const docReference = firebase.firestore().collection(`supervisorRequests`).doc(this.props.supervisorKey);
docReference.set({ user: this.props.userUID, requestDate: new Date().getTime(), userEmail: this.props.email });

然而,我的代码会生成以下结构:

-supervisorRequests
      -supervisor-1-Key
          - user: userID
          - userEmail: userEmail
          - requestDate: timestamp

这不是我想要的,因为每次对主管的密钥提出新请求时,旧请求都会被覆盖。

我的代码有什么问题,如何实现我提出的第一个数据库结构?

【问题讨论】:

    标签: javascript firebase react-native google-cloud-firestore


    【解决方案1】:

    你传递给 collection() 的字符串必须是一个集合的路径。您现在传递的是文档的路径。它通过查看字符串中的正斜杠来识别这一点。也许您想像这样引用文档:

    firebase.firestore()
            .collection('supervisorRequests')
            .doc(this.props.supervisorKey)
    

    您可以使用返回的 DocumentReference 通过其 set() 方法创建文档。

    【讨论】:

    • 我刚刚再次尝试了您的代码。您的解决方案不会在 this.props.supervisorKey 内创建具有随机 ID 的新节点。它只是用新对象更新旧对象。如何添加具有新随机 id 的对象?
    • 正如我在答案中所说,代码返回一个 DocumentReference,然后您可以使用它的 set() 方法创建文档。
    • 要么我没有做你建议我正确做的事情,要么你误解了我想要的输出。我已经更新了我上面的问题,展示了我想要什么结构以及我当前的代码生成了什么。你能再看一眼吗?谢谢!
    • 如果您试图在其他集合中立即拥有集合,这是不可能的。子集合必须有父文档 ID。
    • 哦,真不幸。您能否建议我在这种特定情况下应该如何构建我的数据?最好的方法是什么?
    【解决方案2】:

    为了完成Doug的回答,请注意,您可以直接将“斜杠分隔路径”传递给doc()方法,以获得“引用指定路径处文档的DocumentReference实例”。

    所以你也可以这样做:

    firebase.firestore().doc(`supervisorRequests/${this.props.supervisorKey}`).set();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-11-30
      • 2020-08-28
      • 1970-01-01
      • 1970-01-01
      • 2015-02-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多