web-dev-qa-db-fra.com

Firestore - Comment obtenir l'identifiant d'un document après l'ajout d'un document à une collection

Existe-t-il un moyen d'acquérir l'ID de document généré après l'ajout d'un document à une collection? 

Si j'ajoute un document à une collection qui représente une "publication" dans une application de média social, je souhaite obtenir cet identifiant de document et l'utiliser comme champ dans un autre document d'une collection différente.

Si je ne peux pas obtenir l'ID de document généré après l'ajout d'un document, devrais-je simplement calculer une chaîne aléatoire et fournir l'ID lors de la création du document? De cette façon, je peux utiliser la même chaîne que le champ de mon autre document?

Exemple de structure rapide:

POST (collection)
    Document Id - randomly generated by firebase or by me
USER (collection)
    Document Id - randomly generated by firebase
       userPost: String (this will be the document id 
                         in the post collection that I'm trying to get)
5
Brejuro

Oui c'est possible. Lorsque vous appelez la méthode .add sur une collection, un objet DocumentReference est renvoyé. DocumentReference a le champ id afin que vous puissiez obtenir l'ID après la création du document.

// Add a new document with a generated id.
db.collection("cities").add({
    name: "Tokyo",
    country: "Japan"
})
.then(function(docRef) {
    console.log("Document written with ID: ", docRef.id);
})
.catch(function(error) {
    console.error("Error adding document: ", error);
});

Cet exemple est en JavaScript. Visitez le documentation pour d’autres langues.

8
Daniel Konovalenko

Je recommanderais d'utiliser la fonction grosse flèche car elle ouvre la possibilité d'utiliser this.foo même dans la fonction .then

db.collection("cities").add({
    name: "Tokyo",
    country: "Japan"
})
.then(docRef => {
    console.log("Document written with ID: ", docRef.id);
    console.log("You can now also access .this as expected: ", this.foo)
})
.catch(error => console.error("Error adding document: ", error))

Utiliser function (docRef) signifie que vous ne pouvez pas accéder à this.foo, et une erreur sera renvoyée

.then(function(docRef) {
    console.log("Document written with ID: ", docRef.id);
    console.log("You can now NOT access .this as expected: ", this.foo)
})

Les fonctions de flèche épaisse vous permettront d’accéder à this.foo comme prévu. 

.then(docRef => {
    console.log("Document written with ID: ", docRef.id);
    console.log("You can now also access .this as expected: ", this.foo)
})
6
Christoffer

Si vous voulez utiliser async/await au lieu de .then(), vous pouvez l'écrire comme ceci:

const post = async (doc) => {
    const doc_ref = await db.collection(my_collection).add(doc)
    return doc_ref.id
}

Si vous voulez intercepter des erreurs dans cette fonction, incluez .catch():

    const doc_ref = await db.collection(my_collection).add(doc).catch(err => { ... })

ou vous pouvez avoir la fonction appelante attraper l'erreur.

1
Brent Washburne