Actualmente estoy probando Firestore, y estoy atascado en algo muy simple: "actualizar una matriz (también conocida como un subdocumento)".
Mi estructura de base de datos es super simple. Por ejemplo:
proprietary: "John Doe",
sharedWith:
[
{who: "[email protected]", when:timestamp},
{who: "[email protected]", when:timestamp},
],
Estoy tratando (sin éxito) de insertar nuevos registros en una shareWith
matriz de objetos.
He intentado:
// 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() }] })
Ninguno funciona. Estas consultas sobrescriben mi matriz.
La respuesta puede ser simple, pero no pude encontrarla ...
fuente
arrayUnion
método.Firestore ahora tiene dos funciones que le permiten actualizar una matriz sin volver a escribir todo.
Enlace: https://firebase.google.com/docs/firestore/manage-data/add-data , específicamente https://firebase.google.com/docs/firestore/manage-data/add-data#update_elements_in_an_array
fuente
Puede usar una transacción ( https://firebase.google.com/docs/firestore/manage-data/transactions ) para obtener la matriz, presionarla y luego actualizar el documento:
fuente
documentReference
complementouserRef
como se muestra:transaction.set(userRef, { bookings: [booking] });
Aquí está el último ejemplo de la documentación de Firestore:
firebase.firestore.FieldValue. ArrayUnion
fuente
Lo siento, tarde para la fiesta, pero Firestore lo resolvió en agosto de 2018, por lo que si todavía lo está buscando, aquí están todos los problemas resueltos con respecto a las matrices.
https://firebase.googleblog.com/2018/08/better-arrays-in-cloud-firestore.html Entrada de blog oficial
array-contains, arrayRemove, arrayUnion para comprobar, eliminar y actualizar matrices. Espero eso ayude.
fuente
Para aprovechar la respuesta de Sam Stern , también hay una tercera opción que me facilitó las cosas y es usar lo que Google llama un mapa, que es esencialmente un diccionario.
Creo que un diccionario es mucho mejor para el caso de uso que estás describiendo. Normalmente uso matrices para cosas que no se actualizan demasiado, por lo que son más o menos estáticas. Pero para las cosas que se escriben mucho, específicamente los valores que deben actualizarse para los campos que están vinculados a otra cosa en la base de datos, los diccionarios demuestran ser mucho más fáciles de mantener y trabajar.
Entonces, para su caso específico, la estructura de la base de datos se vería así:
Esto le permitirá hacer lo siguiente:
La razón para definir el objeto como una variable es que usarlo
'sharedWith.' + whoEmail + '.when'
directamente en el método set resultará en un error, al menos cuando lo use en una función de nube de Node.js.fuente
Aparte de las respuestas mencionadas anteriormente. Esto lo hará. Usando Angular 5 y AngularFire2. o use firebase.firestore () en lugar de this.afs
fuente
Considere a John Doe como un documento en lugar de una colección
Dale una colección de cosas y cosasSharedWithOthers
Luego, puede mapear y consultar las cosas compartidas de John Doe en esa colección paralela thingsSharedWithOthers.
fuente
Si alguien está buscando una solución sdk de Java Firestore para agregar elementos en el campo de matriz:
Para eliminar elementos del usuario de la matriz:
FieldValue.arrayRemove()
fuente
fuente
Así es como lo hice funcionar. Espero que les ayude a todos, ya que lo veo como una solución mucho mejor. Aquí quiero cambiar el estado de la tarea de abierta (cerrar = falso) a cerrar (cerrar = verdadero), manteniendo todo lo demás igual en el objeto.
y aquí está el servicio que realmente lo actualiza
fuente