将ID保存到Firestore文档

时间:2018-01-16 15:02:57

标签: angular firebase ionic3 google-cloud-firestore

我希望将文档的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结构: enter image description here

enter image description here

8 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:1)

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

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

code显示了JavaScript SDK生成ID的功能,这可归结为调用AutoId.newId()。您也可以在自己的代码中调用(或包含以防未公开导出),然后使用doc(myId)代替add()

答案 2 :(得分:0)

我收到的文件是:

this.itemsCollection.valueChanges()

我把它改为:

this.sets = this.itemsCollection.snapshotChanges()

现在我可以使用$key获取ID并更新我的文档而无需额外的参考。

更多信息:

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

How to get firebase id

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

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

如果这仍然是一个问题,这就是我的发现, 您需要创建一个空文档并获取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
})

答案 5 :(得分:0)

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

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

此示例显示如何在person集合中存储obj。名称为JOHN。

答案 6 :(得分:0)

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

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)})

答案 7 :(得分:0)

这里有其他选项。

在 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 } });
})