81 votes

Cloud Firestore : Mise à jour des champs dans les objets imbriqués avec une clé dynamique

En 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 d'une couleur.

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

ce n'est bien sûr pas possible et cela entraînera une erreur.

J'ai essayé de faire ça :

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

La mise à jour se fait avec la bonne clé mais malheureusement, elle écrase les autres clés (elles sont supprimées).

103voto

Brieuc Points 1098

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);

9 votes

2 votes

Je me demande si ça marche vraiment. Je m'attendrais à ce que cela écrase la valeur actuelle de usersUpdate avec le nouveau avec une seule valeur, à savoir {favorites {KEY: {color: true}}} Si ce que tu dis est correct, alors il n'y aurait aucun moyen de mettre à jour usersUpdate à une valeur totalement nouvelle.

4 votes

Plus brièvement, @Georg Hackenberg signale cette solution : db.collection('users').doc('frank').update({ [`favorites.${key}.color`] = true })

58voto

Georg Hackenberg Points 191

Cette solution a fonctionné pour moi :

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

3 votes

Solution correcte.

1 votes

Db.collection('users').doc('frank').update({[`favorites.${key}.color `] : true })

3 votes

Cette solution est correcte. Il existe aussi une autre solution : db.collection('users').doc('frank').update({ [`favorites.${key}.color `]: true }) et faites également attention à éviter les espaces vides à l'intérieur de la section [``], c'est-à-dire que vous finirez par faire une erreur si vous incluez un espace vide. db.collection('users').doc('frank').update({ [` favorites.${key}.color `]: true }

25voto

Brian Mortenson Points 2355

Juste une remarque sur un piège potentiel : Après avoir découvert que vous pouvez mettre à jour des champs imbriqués en utilisant la syntaxe du point, j'ai essayé d'utiliser la fonction set() de la même manière, puisque j'avais besoin que cela fonctionne que l'objet existe déjà ou non :

var updateObj = {['some.nested.property']: 9000};
docRef.set(updateOb, {merge: true});

Malheureusement, cela ne fonctionne pas - cela définit une propriété dont la clé est some.nested.property à la place. Inconsistant, mais bon.

Heureusement, il semble que set(updateObj, {merge: true}) effectue une fusion profonde, donc si vous construisez votre objet de mise à jour comme un objet entièrement imbriqué, vos objets imbriqués seront également correctement fusionnés :

// 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 } } }

3voto

Ron Royston Points 5179

Vous pouvez mettre à jour des champs spécifiques d'objets imbriqués nommés variable(s) 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 votes

C'est la réponse la plus utile pour un usage général. Merci de m'avoir aidé.

0voto

deepak n Points 31

J'ai pensé que c'était la solution la plus simple de toutes les solutions ci-dessus :)

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X