127 votes

Est-il possible d'obtenir l'identifiant avant qu'il ne soit ajouté ?

Je sais qu'en 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 ensuite je pourrais l'ajouter en utilisant cet ID.

Puis-je l'obtenir également dans le Cloud Firestore?

215voto

34m0 Points 1710

Ce sujet est traité dans le documentation . Voir le dernier paragraphe de la section "Ajouter un document".

DocumentReference ref = db.collection("my_collection").doc();
String myId = ref.id;

3 votes

Est-il possible que l'obtention de l'ID généré avant l'ajout supplante les autres données après l'ajout ? (parce que cet ID a été généré avant...)

0 votes

La même chose m'a traversé l'esprit... dans le magasin d'usine. .document() ne donne pas l'impression de communiquer avec la base de données de la même manière. push() a fait. Je crois que l'opinion générale est que la probabilité d'une collision avec une id est si faible que nous n'avons pas à nous en préoccuper.

1 votes

Pouvez-vous revérifier cela ? Cela ne fonctionne plus. Faire .doc() donne une erreur typographique indiquant qu'un seul argument est nécessaire.

52voto

const db = firebase.firestore();
const ref = db.collection('your_collection_name').doc();
const id = ref.id;

26 votes

Veuillez expliquer vos réponses, ne vous contentez pas d'un simple code.

0 votes

J'utilise vue-fire et celui-ci a fonctionné pour moi. Merci.

7 votes

@SterlingArcher Qu'y a-t-il à expliquer ? Question honnête.

26voto

Jassi Points 329

Vous pouvez le faire de la manière suivante (le code est pour AngularFire2 v5, qui est similaire à toute autre version de firebase SDK dire web, node etc)

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

projetsRef c'est la référence de la collection du magasin de feu.

données est un objet avec la clé, la valeur que vous voulez télécharger à firestore.

afs Le module angularfirestore est injecté dans le constructeur.

Cela va générer un nouveau document dans la collection appelé projectsRef, avec son id comme pushKey et ce document aura la même propriété pushKey que l'id du document.

N'oubliez pas que l'installation supprimera également toutes les données existantes

En fait, .add() et .doc().set() sont les mêmes opérations. Mais avec .add() l'identifiant est généré automatiquement et avec .doc().set() vous pouvez fournir un identifiant personnalisé.

6voto

VisWebsoft Points 112

Je ne sais pas si cela peut vous aider, mais je voulais obtenir l'identifiant du document à partir de la base de données Firestore, c'est-à-dire des données qui avaient déjà été saisies 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 je le ferais pour n'importe quelle autre propriété.

Je ne sais pas pourquoi le id ne fait pas seulement partie de .data() en premier lieu !

0 votes

Je me demande si c'est une bonne pratique de le faire. Cela aurait certainement du sens, en plus de faciliter l'utilisation des modèles de données côté client.

0 votes

Cela fait un moment que je n'ai pas étudié la question, mais je ne vois rien de "mauvais" dans cette approche.

3voto

Ken Mueller Points 517

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 n'ait fini de récupérer l'ID du document. Vous devez donc attendre que documentID ait fini de se charger 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 le plus joli, mais c'est la seule façon de faire ce que vous demandez. Ce code est dans Swift 5 .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X