web-dev-qa-db-fra.com

Firestore - Est-il possible d'obtenir l'identifiant avant de l'ajouter?

Je sais que dans Realtime Database je pourrais obtenir le Push ID avant qu'il ne soit ajouté comme ceci:

 DatabaseReference databaseReference= FirebaseDatabase.getInstance().getReference();
        String challengeId=databaseReference.Push().getKey();

et puis je pourrais l'ajouter en utilisant cet identifiant.

Puis-je l'obtenir aussi dans le Cloud Firestore?

38
Tal Barda

Ceci est couvert dans le documentation . Voir le dernier paragraphe de la section Ajouter un document.

DocumentReference ref = db.collection("my_collection").document();
String myId = ref.getId();
79
34m0
const db = firebase.firestore();
const ref = db.collection('your_collection_name').doc();
const id = ref.id;
19

projectsRef est une collection de produits de stockage.

data est l'objet avec la clé, la valeur que vous souhaitez télécharger sur le magasin de feu.

afs est le module angularfirestore injecté dans le constructeur

Vous pouvez le faire de la manière suivante (le code est destiné à AngularFire2 v5, qui est similaire à toute autre version de SDK firebase, telle que Web, noeud, etc.).

const pushkey = this.afs.createId();
const project = {' pushKey': pushkey, ...data };
this.projectsRef.doc(pushkey).set(project);

Cela va générer un nouveau document chez Collection appelé projectsRef avec son identifiant chez pushKey et ce document aura la propriété pushKey identique à celle du document.

Rappelez-vous, set supprimera également toutes les données existantes

En fait .add () et .doc (). Set () sont identiques à .add () l'identifiant est généré automatiquement. Avec .doc (). Set (), vous pouvez fournir un identifiant personnalisé.

13
Jassi

IDK si cela aide, mais je voulais obtenir l'ID du document à partir de la base de données Firestore, c'est-à-dire des données déjà entrées dans la console.

Je voulais un moyen facile d'accéder à cet ID à la volée, alors je l'ai simplement ajouté à l'objet document comme suit:

const querySnapshot = await db.collection("catalog").get();
      querySnapshot.forEach(category => {
        const categoryData = category.data();
        categoryData.id = category.id;

Maintenant, je peux accéder à cette id comme n'importe quelle autre propriété.

IDK pourquoi la id ne fait pas simplement partie de .data()!

4
CodeFinity

Malheureusement, cela ne fonctionnera pas:

let db = Firestore.firestore()

let documentID = db.collection(“myCollection”).addDocument(data: ["field": 0]).documentID

db.collection(“myOtherCollection”).document(documentID).setData(["field": 0])

Cela ne fonctionne pas car la deuxième instruction s'exécute avant que documentID ait fini d'obtenir l'ID du document. Donc, vous devez attendre que documentID termine le chargement avant de définir le document suivant:

let db = Firestore.firestore()

var documentRef: DocumentReference?

documentRef = db.collection(“myCollection”).addDocument(data: ["field": 0]) { error in
    guard error == nil, let documentID = documentRef?.documentID else { return }

    db.collection(“myOtherCollection”).document(documentID).setData(["field": 0])
}

Ce n'est pas la plus jolie, mais c'est la seule façon de faire ce que vous demandez. Ce code est dans Swift 5.

2
Ken Mueller

Cela fonctionne pour moi. Je met à jour le document alors que dans la même transaction. Je crée le document et le mets immédiatement à jour avec l'ID de document.

        let db = Firestore.firestore().collection(“cities”)

        var ref: DocumentReference? = nil
        ref = db.addDocument(data: [
            “Name” : “Los Angeles”,
            “State: : “CA”
        ]) { err in
            if let err = err {
                print("Error adding document: \(err)")
            } else {
                print("Document added with ID: \(ref!.documentID)")
                db.document(ref!.documentID).updateData([
                    “myDocumentId” : "\(ref!.documentID)"
                ]) { err in
                    if let err = err {
                        print("Error updating document: \(err)")
                    } else {
                        print("Document successfully updated")
                    }
                }
            }
        }

Ce serait bien de trouver un moyen plus propre de le faire, mais jusque-là cela fonctionne pour moi.

0
Jose Carrillo

Dans Dart, vous pouvez utiliser:

`var itemRef = Firestore.instance.collection("user")
 var doc = itemRef.document().documentID;
 await itemRef.document(doc).setData(data).then((val){
   print("document Id ----------------------: $doc");
 });`
0
Naveen Yadav