siguiendo la documentación oficial de firestore:
{ name: "Frank", favorites: { food: "Pizza", color: "Blue", subject: "recess" }, age: 12 } // To update favorite color: db.collection("users").doc("frank").update({ "favorites.color": "Red" })Me gustaría usar una clave dinámica en lugar de color.
db.collection("users").doc("frank").update({ "favorites[" + KEY + "].color": true });esto, por supuesto, no es posible y arrojará un error.
He estado tratando de hacer esto:
db.collection("users").doc("frank").update({ favorites: { [key]: { color": true } } });En realidad, se está actualizando con la clave correcta pero, desafortunadamente, está sobrescribiendo las otras claves (se están eliminando).
Encontré la solución inspirada en una solución de firebase (reemplazando "/" por ".").
var usersUpdate = {}; usersUpdate[`favorites.${key}.color`] = true; db.collection("users").doc("frank").update(usersUpdate);Esta solución funcionó para mí:
db.collection('users').doc('frank').update({ [`favorites.${key}.color`]: true });Solo una nota sobre una posible trampa: después de descubrir que puede actualizar los campos anidados usando una sintaxis de puntos, intenté usar set() de la misma manera, ya que necesitaba que funcionara ya sea que el objeto ya exista o no:
var updateObj = {['some.nested.property']: 9000}; docRef.set(updateOb, {merge: true}); Desafortunadamente, esto no funciona; en su lugar, establece una propiedad cuya clave es some.nested.property . Incoherente, pero bueno.
Afortunadamente, parece que set(updateObj, {merge: true}) realiza una fusión profunda, por lo que si construye su objeto de actualización como un objeto completamente anidado, sus objetos anidados también se fusionarán correctamente:
// create the object db.doc('testCollection/doc').set({p1: {['p2']: {p3: true}}}, {merge: true}) // update the existing object db.doc('testCollection/doc').set({p1: {['p2']: {p4: true}}}, {merge: true}) // result is now this: { p1: { p2: { p4: true, p3: true } } }