J'essaye actuellement Firestore, et je suis coincé à quelque chose de très simple: "mettre à jour un tableau (aka un sous-document)".
Ma structure DB est super simple. Par exemple:
proprietary: "John Doe",
sharedWith:
[
{who: "[email protected]", when:timestamp},
{who: "[email protected]", when:timestamp},
],
J'essaye (sans succès) de pousser de nouveaux enregistrements dans un shareWith
tableau d'objets.
J'ai essayé:
// With SET
firebase.firestore()
.collection('proprietary')
.doc(docID)
.set(
{ sharedWith: [{ who: "[email protected]", when: new Date() }] },
{ merge: true }
)
// With UPDATE
firebase.firestore()
.collection('proprietary')
.doc(docID)
.update({ sharedWith: [{ who: "[email protected]", when: new Date() }] })
Aucun ne fonctionne. Ces requêtes écrasent mon tableau.
La réponse est peut-être simple, mais je n'ai pas pu la trouver ...
la source
arrayUnion
méthode.Firestore a maintenant deux fonctions qui vous permettent de mettre à jour un tableau sans réécrire le tout.
Lien: https://firebase.google.com/docs/firestore/manage-data/add-data , en particulier https://firebase.google.com/docs/firestore/manage-data/add-data#update_elements_in_an_array
la source
Vous pouvez utiliser une transaction ( https://firebase.google.com/docs/firestore/manage-data/transactions ) pour obtenir le tableau, pousser dessus, puis mettre à jour le document:
la source
documentReference
ajoutuserRef
comme indiqué:transaction.set(userRef, { bookings: [booking] });
Voici le dernier exemple de la documentation Firestore:
firebase.firestore.FieldValue. ArrayUnion
la source
Désolé en retard pour faire la fête, mais Firestore l'a résolu en août 2018, donc si vous cherchez toujours cela, tous les problèmes sont résolus en ce qui concerne les tableaux.
https://firebase.googleblog.com/2018/08/better-arrays-in-cloud-firestore.html Message de blog officiel
array-contains, arrayRemove, arrayUnion pour vérifier, supprimer et mettre à jour les tableaux. J'espère que ça aide.
la source
Pour s'appuyer sur la réponse de Sam Stern , il existe également une troisième option qui m'a simplifié les choses et qui utilise ce que Google appelle une carte, qui est essentiellement un dictionnaire.
Je pense qu'un dictionnaire est bien meilleur pour le cas d'utilisation que vous décrivez. J'utilise généralement des tableaux pour des éléments qui ne sont pas vraiment trop mis à jour, donc ils sont plus ou moins statiques. Mais pour les choses qui sont beaucoup écrites, en particulier les valeurs qui doivent être mises à jour pour les champs qui sont liés à autre chose dans la base de données, les dictionnaires s'avèrent beaucoup plus faciles à maintenir et à utiliser.
Donc, pour votre cas spécifique, la structure de la base de données ressemblerait à ceci:
Cela vous permettra de faire ce qui suit:
La raison de la définition de l'objet en tant que variable est que l'utilisation
'sharedWith.' + whoEmail + '.when'
directe dans la méthode set entraînera une erreur, du moins lors de son utilisation dans une fonction cloud Node.js.la source
Autre que les réponses mentionnées ci-dessus. Cela le fera. Utilisation d'Angular 5 et AngularFire2. ou utilisez firebase.firestore () au lieu de this.afs
la source
Considérez John Doe comme un document plutôt qu'une collection
Donnez-lui une collection de choses et de choses partagées avec d'autres
Ensuite, vous pouvez mapper et interroger les éléments partagés de John Doe dans cette collection parallèle thingsSharedWithOthers.
la source
Si quelqu'un recherche une solution Java Firestore SDK pour ajouter des éléments dans le champ du tableau:
Pour supprimer des éléments de l'utilisateur de la baie:
FieldValue.arrayRemove()
la source
la source
C'est ainsi que je l'ai fait fonctionner. J'espère que cela vous aidera tous car je le vois comme une solution bien meilleure. Ici, je veux changer le statut de la tâche de ouverte (close = false) à close (close = true), tout en gardant tout le reste identique dans l'objet.
et voici le service qui le met à jour
la source