web-dev-qa-db-fra.com

Comment mettre à jour un seul document Firestore

Après l'authentification, j'essaie de rechercher un document utilisateur dans/users /, puis je souhaite mettre à jour le document avec les données de l'objet auth ainsi que certaines propriétés utilisateur personnalisées. Mais je reçois un message d'erreur indiquant que la méthode de mise à jour n'existe pas. Est-il possible de mettre à jour un seul document? Tous les exemples de documents Firestore supposent que vous avez l'identifiant de document réel et qu'aucun exemple ne demande d'interrogation avec une clause where.

firebase.firestore().collection("users").where("uid", "==", payload.uid)
  .get()
  .then(function(querySnapshot) {
      querySnapshot.forEach(function(doc) {
          console.log(doc.id, " => ", doc.data());
          doc.update({foo: "bar"})
      });
 })
13
Jim Jones

Vous pouvez construire une référence de document à partir du doc.id:

var db = firebase.firestore();

db.collection("users").where("uid", "==", payload.uid)
  .get()
  .then(function(querySnapshot) {
      querySnapshot.forEach(function(doc) {
          console.log(doc.id, " => ", doc.data());
          // Build doc ref from doc.id
          db.collection("users").doc(doc.id).update({foo: "bar"});
      });
 })
17
Juan Lara

Vérifiez si l'utilisateur est déjà là alors simplement .update, ou .set si non:

    var docRef = firebase.firestore().collection("users").doc(firebase.auth().currentUser.uid);
    var o = {};
    docRef.get().then(function(thisDoc) {
        if (thisDoc.exists) {
            //user is already there, write only last login
            o.lastLoginDate = Date.now();
            docRef.update(o);
        }
        else {
            //new user
            o.displayName = firebase.auth().currentUser.displayName;
            o.accountCreatedDate = Date.now();
            o.lastLoginDate = Date.now();
            // Send it
            docRef.set(o);
        }
        toast("Welcome " + firebase.auth().currentUser.displayName);
    });
}).catch(function(error) {
    toast(error.message);
});
11
Ron Royston