Estoy tratando de crear un formulario en el que, cuando se envíe, primero se elimine el campo existente y luego se envíe un campo nuevo. El campo contiene una clave que es el UID del usuario y el valor es la marca de tiempo.
Funciona cuando codifico la clave exacta, pero no funciona si la uso como variable.
Este código funciona.
db.collection("jmTest").doc(docID).update({ "food.up.8ebenfqRMmapx84tRpCp6dY3F4j1": firebase.firestore.FieldValue.delete(), "food.down.8ebenfqRMmapx84tRpCp6dY3F4j1": firebase.firestore.FieldValue.delete() });Este código no funciona.
var userUID = user.uid // declare and initialize db.collection("jmTest").doc(docID).update({ "food.up.${userUID}": firebase.firestore.FieldValue.delete(), "food.down.${userUID}": firebase.firestore.FieldValue.delete() });Este código no funciona.
db.collection("jmTest").doc(docID).update({ food: { up: { userUID: firebase.firestore.FieldValue.delete() } } });También he intentado usar estos en lugar de solo "uid".
[userUID] ${userUID} String(userUID)Este código no funciona.
var userUID = user.uid // declare and initialize var foodUp = "food.up." + [userUID]; var foodDown = "food.down." + [userUID]; db.collection("jmTest").doc(docID).update({ foodUp: firebase.firestore.FieldValue.delete(), foodDown: firebase.firestore.FieldValue.delete() });En el siguiente bloque de código, ha intentado utilizar cadenas con plantilla, pero las ha encerrado entre comillas dobles en lugar de acentos graves. Además, no está permitido usar cadenas de plantilla en declaraciones de objetos, por lo que también debe encerrarlos entre corchetes para usar la sintaxis de expresión.
db.collection("jmTest").doc(docID).update({ "food.up.${userUID}": firebase.firestore.FieldValue.delete(), "food.down.${userUID}": firebase.firestore.FieldValue.delete() });debiera ser
db.collection("jmTest").doc(docID).update({ [`food.up.${userUID}`]: firebase.firestore.FieldValue.delete(), [`food.down.${userUID}`]: firebase.firestore.FieldValue.delete() }); De manera similar, en las siguientes líneas, intenta usar el valor dinámico de una variable, pero en su lugar especifica el nombre de las claves como foodUp y foodDown en lugar de usar el valor de la expresión/variable como clave:
var userUID = user.uid // declare and initialize var foodUp = "food.up." + [userUID]; // while this "works", use: "food.up." + userUID var foodDown = "food.down." + [userUID]; db.collection("jmTest").doc(docID).update({ foodUp: firebase.firestore.FieldValue.delete(), foodDown: firebase.firestore.FieldValue.delete() });debiera ser
const userUID = user.uid // declare and initialize const foodUp = "food.up." + userUID; const foodDown = "food.down." + userUID; db.collection("jmTest").doc(docID).update({ [foodUp]: firebase.firestore.FieldValue.delete(), [foodDown]: firebase.firestore.FieldValue.delete() });o
const userUID = user.uid // declare and initialize db.collection("jmTest").doc(docID).update({ ["food.up." + userUID]: firebase.firestore.FieldValue.delete(), ["food.down." + userUID]: firebase.firestore.FieldValue.delete() }); Cuando utilice los bloques de código anteriores, tenga cuidado de que el userUID de usuario no sea null o undefined , ya que puede dar lugar a un comportamiento no intencionado.
Como nota al margen, es 2022, use let y const en lugar de var cuando sea adecuado y apropiado.