web-dev-qa-db-fra.com

Cloud Firestore: mise à jour des champs dans des objets imbriqués avec clé dynamique

suivant la documentation officielle 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"
})

Je voudrais utiliser une clé dynamique au lieu de la couleur.

db.collection("users").doc("frank").update({
    "favorites[" + KEY + "].color": true
});

ce n'est bien sûr pas possible et jettera une erreur.

J'ai essayé de faire ceci:

db.collection("users").doc("frank").update({
    favorites: {
        [key]: {
            color": true
        }
    }
});

En réalité, il met à jour avec la bonne clé, mais malheureusement, il écrase les autres clés (elles sont en cours de suppression).

25
Brieuc

J'ai trouvé la solution inspirée d'une solution firebase (en remplaçant "/" par "."). 

var usersUpdate = {};
usersUpdate[`favorites.${key}.color`] = true;

db.collection("users").doc("frank").update(usersUpdate);
41
Brieuc

Cette solution a fonctionné pour moi:

db.collection('users').doc('frank').update({
  ['favorites.' + key + '.color']: true
});
8

Vous pouvez mettre à jour des champs spécifiques d'objets imbriqués nommés de manière variable (comme ci-dessous).

ref.set({
    name: "Frank",
    favorites: { food: "Pizza", quantity: 2 }
});

//now the relevant update code
var name = "favorites";
var qty = 111;
var update = {};
update[name+".quantity"] = qty;
ref.update(update);

https://jsbin.com/hihifedizu/edit?js,console

0
Ron Royston