【问题标题】:How to create subfolder and document on Firestore web?如何在 Firestore Web 上创建子文件夹和文档?
【发布时间】:2020-05-27 10:33:40
【问题描述】:

我是 Firebase 的新手,我想使用 Firestore 来存储用户注册内容。我有一个名为“用户”的集合,每个用户都有一个必须包含 JSON 文档的“注册”和一个必须是集合或文档数组的“月刊”。目前我尝试只添加带有两个字段的“注册”文档:

async saveUser(user) {
      var db = firebase.firestore();
      await db
        .collection("users")
        .doc(user.uid)
        .doc("register")
        .set(
          {
            name: user.displayName,
            email: user.email
          },
          {
            merge: true
          }
        );
    },

但错误显示:

Uncaught (in promise) TypeError: db.collection(...).doc(...).doc is not a function
    at _callee$ (Login.vue?7463:75)
    at tryCatch (runtime.js?96cf:45)
    at Generator.invoke [as _invoke] (runtime.js?96cf:271)
    at Generator.prototype.<computed> [as next] (runtime.js?96cf:97)
    at asyncGeneratorStep (asyncToGenerator.js?1da1:3)
    at _next (asyncToGenerator.js?1da1:25)
    at eval (asyncToGenerator.js?1da1:32)
    at new Promise (<anonymous>)
    at VueComponent.eval (asyncToGenerator.js?1da1:21)
    at VueComponent.saveUser (Login.vue?7463:75)

那么,我怎样才能最容易地创建这个结构和更新?

【问题讨论】:

    标签: javascript firebase vue.js google-cloud-firestore


    【解决方案1】:

    使用 Firestore,文档不能包含立即嵌套的文档。如果您想在另一个文档下组织一个文档,您需要选择一个子集合的名称,然后使用它来构建嵌套在该子集合中的文档:

    await db
        .collection("users")
        .doc(user.uid)
        .collection("data")
        .doc("register")
        .set(...)
    

    在这里,我只是为子集合选择了名称“数据”。您应该以对您打算执行的查询有意义的方式组织数据。

    【讨论】:

      【解决方案2】:

      正如 Doug 所回答的,您可以将这些值存储在嵌套集合中。

      但如果值是单数(它们不是集合),我通常会将它们直接存储在用户文档中。所以:

      async saveUser(user) {
        var db = firebase.firestore();
        await db
          .collection("users")
          .doc(user.uid)
          .set(
            {
              name: user.displayName,
              email: user.email
            },
            {
              merge: true
            }
          );
      },
      

      如果您已经为用户存储了其他数据,您可以将新数据作为嵌套字段存储在同一个文档中:

      async saveUser(user) {
      
        var db = firebase.firestore();
        await db
          .collection("users")
          .doc(user.uid)
          .set({
            register: {
              "name": user.displayName,
              "email": user.email
            }}, {
              merge: true
            }
          );
      },
      

      【讨论】:

      • 在嵌套示例中,您在 name 周围添加了引号——有什么理由这样做吗?
      • 啊,我之前已经完成了“register.name”以到达需要引号的嵌套字段。但我意识到嵌套的 register 对象可能更有意义。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-06
      • 2014-01-17
      • 1970-01-01
      • 1970-01-01
      • 2022-01-02
      • 1970-01-01
      相关资源
      最近更新 更多