Después de la autenticación, intento buscar un documento de usuario en /usuarios/, luego me gustaría actualizar el documento con datos del objeto de autenticación, así como algunas propiedades de usuario personalizadas. Pero recibo un error de que el método de actualización no existe. ¿Hay alguna manera de actualizar un solo documento? Todos los ejemplos de documentos de firestore asumen que tiene la identificación del documento real, y no tienen ningún ejemplo de consulta con una cláusula 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"}) }); })Puede hacer exactamente lo siguiente ( https://firebase.google.com/docs/reference/js/v8/firebase.firestore.DocumentReference ):
var db = firebase.firestore(); db.collection("users").doc(doc.id).update({foo: "bar"});Compruebe si el usuario ya está allí y luego simplemente .update , o .set si no es así:
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); });en su código original cambiando esta línea
doc.update({foo: "bar"})a esto
doc.ref.update({foo: "bar"})Deberia trabajar
pero una mejor manera es usar la escritura por lotes: https://firebase.google.com/docs/firestore/manage-data/transactions#batched-writes