【问题标题】:Save ID to Firestore document将 ID 保存到 Firestore 文档
【发布时间】:2018-06-25 08:02:26
【问题描述】:

我还想将文档的 id 保存为属性,而不仅仅是作为集合的参考。目前我是这样保存的:

const newSet: AngularFirestoreDocument<SetModel> = this.AngularFirestore.doc('users/' + this.navParams.data.userId);

    // adding user to our ddbb
    newSet.collection('sets').add(this.set)
      .then(function (docRef) {
        // ok
      })
      .catch(function (error) {
        // error
      });

这可能吗?还是我需要保存它,获取 id 并再次更新它?

PS 这是我的 ddbb 结构:

【问题讨论】:

    标签: angular firebase ionic3 google-cloud-firestore


    【解决方案1】:

    通过快速扫描reference documentation for CollectionReference.add(...),我看到add(...) 返回了一个承诺。在创建文档之前似乎无法获取自动生成的 ID。

    但请记住,文档 ID 只是在统计上保证唯一的客户端键。

    这个code 显示了JavaScript SDK 为生成ID 所做的事情,这归结为调用AutoId.newId()。您也可以在自己的代码中调用(或在未公开导出的情况下包含)它,然后使用 doc(myId) 而不是 add()

    【讨论】:

    • 但是如果我使用 AutoId.newId() 我要保存一个不同的 id?不确定我是否在关注你...我正在考虑创建一个新的 id,如下所示: const newSetID = '_' + Math.random().toString(36).substr(2, 9);它会有所不同,但很好......我可以和那个一起工作。最后只是一个参考
    • 我不确定您是否也可以将此生成的 id 设为默认值
    • 您的代码与AutoId.newId() 类似,只是后者生成重复ID 的可能性要小得多。 Firestore 中没有“默认 ID”之类的东西:您指定给 document(myNewId) 的任何内容都是文档的 ID。如果您没有在此处指定任何内容,或者调用 add(),Firestore SDK 会使用我链接的代码为您生成一个 ID。
    • 无论如何我都不能使用不同的...当我执行 const newSet: AngularFirestoreDocument = this.AngularFirestore.doc('users/' + this.navParams.data.userId + '/' + this.navParams.data.set.id);我需要指出“真实的”。一个作为集合的参考,而不是作为我文档的属性
    • 如何生成这个 AutoId.newId()?我尝试使用我的 NewSet,但它没有任何 AutoId 属性/方法
    【解决方案2】:

    我正在用这个来获取我的文件:

    this.itemsCollection.valueChanges()
    

    我改成:

    this.sets = this.itemsCollection.snapshotChanges()
    

    现在我可以使用$key 获取他们的 ID,并在没有额外参考的情况下更新我的文档。

    更多信息:

    https://github.com/angular/angularfire2/issues/1278

    How to get firebase id

    编辑:这是我需要的解决方案,但不完全适合我在这里寻找的解决方案

    【讨论】:

      【解决方案3】:

      1 - 创建一个常量 ID。 2 - 在对象中设置 id。 3 - 保存

        createEvent(set){
          const id = this.firestore.createId();
          set.id = id;
          return this.firestore.doc(`users/${id}`).set(ev);
        }
      

      【讨论】:

      • 谢谢,这里是最简单的答案。
      • 什么类“this.firestore”represets?收藏?在文档中找不到这个
      • 构造函数(私有firestore:AngularFirestore){}
      • 假设我创建例如一个过程中有数千个文件,这(可能)会导致重复的 ID 吗? (假设 createId() 在一段时间内没有“保留”ID)
      • 简而言之,自动生成的 iD 在统计上是独一无二的,并且有足够的概率一直考虑它。
      【解决方案4】:

      如果您的意图是在查询集合时知道记录的 ID,我认为这将是一个很好的解决方案。

      firebase.firestore().collection('sets').get()
          .then(querySnapshot => {
            querySnapshot.forEach(doc => {
              this.sets.push({ ...doc.data(), id: doc.id })
            })
          })
          .catch(error => {
            console.log(error)
          })
      

      【讨论】:

        【解决方案5】:

        如果这仍然是一个问题,这就是我发现的, 您需要创建一个空文档并获取 id,然后设置文档内容。 在你的情况下,它会是这样的。

        const newDoc = newSet.collection('sets').doc()
        const newDocRef = await newDoc.get()
        

        现在设置整个文档:

        await newSet.collection('sets').doc(newDocRef.id).set({
            docId: newDocRef.id,
            // res of the document
        })
        

        【讨论】:

          【解决方案6】:

          这显示了如何在文档中设置自己的 ID,将 MY_ID 替换为您自己的 ID,然后使用 SET 命令将对象存储到文档中。此函数返回 void,因此您无法检查或获取任何回调。

          db.collection("persons").doc("MY_ID").set({
              name: "JOHN",
          })
          

          这个例子展示了如何在 person 集合中存储一个 obj。名叫约翰。

          【讨论】:

          • 虽然此代码可以解决问题,including an explanation 说明如何以及为什么解决问题将真正有助于提高您的帖子质量,并可能导致更多的赞成票。请记住,您正在为将来的读者回答问题,而不仅仅是现在提问的人。请edit您的答案以添加解释并说明适用的限制和假设。 From Review
          【解决方案7】:

          这就是我最终这样做的方式。我创建一个文档,然后在收到承诺后添加数据。

          firebase.firestore.collection('instances').doc("WDXmpzpY1TWRIJjeBNrx")
          .collection("suppliers").add({}).then(docRef 
          => {
              firebase.firestore.collection('instances').doc("WDXmpzpY1TWRIJjeBNrx")
              .collection("suppliers").doc(docRef.id).set({
                 name:this.supplierForm.name,
                 phone:this.supplierForm.phone,
                 email:this.supplierForm.email,
                 address:this.supplierForm.address,
                 gstNo:this.supplierForm.gstNo,
                 uniqueID: docRef.id,
              })
           }).catch(err => {console.log(err)})
          

          【讨论】:

            【解决方案8】:

            这里有其他选项。

            在 Firebase 中:

            saveAlert(alert: Alert) {
                const alertsCollection = this.firestore.collection<Alert>('alerts');
                const id = this.firestore.createId();
                alert.code = id;
                return alertsCollection.doc(id).set(alert);
            }
            

            在 NodeJS 中:

            app.post('/', async (req, res) => {
                const data = {
                    code: '',
                    name: req.body.name,
                    description: req.body.description
                }
                const reference = db.collection('alerts').doc();
                data.code = reference.id;
                await reference.set(data);
                res.json({ status: 'success', data: { alert: data } });
            })
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2021-03-27
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2019-06-15
              • 1970-01-01
              相关资源
              最近更新 更多