Obecnie próbuję Firestore i utknąłem na czymś bardzo prostym: „aktualizowanie tablicy (czyli dokumentu podrzędnego)”.
Moja struktura bazy danych jest super prosta. Na przykład:
proprietary: "John Doe",
sharedWith:
[
{who: "[email protected]", when:timestamp},
{who: "[email protected]", when:timestamp},
],
Próbuję (bez powodzenia) wypchnąć nowe rekordy do shareWith
tablicy obiektów.
Próbowałem:
// 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() }] })
Żadne nie działa. Te zapytania zastępują moją tablicę.
Odpowiedź może być prosta, ale nie mogłem jej znaleźć ...
źródło
arrayUnion
metody.Firestore ma teraz dwie funkcje, które pozwalają aktualizować tablicę bez ponownego pisania całej rzeczy.
Link: https://firebase.google.com/docs/firestore/manage-data/add-data , w szczególności https://firebase.google.com/docs/firestore/manage-data/add-data#update_elements_in_an_array
źródło
Możesz użyć transakcji ( https://firebase.google.com/docs/firestore/manage-data/transactions ), aby pobrać tablicę, wypchnąć ją, a następnie zaktualizować dokument:
źródło
documentReference
dodania,userRef
jak pokazano:transaction.set(userRef, { bookings: [booking] });
Oto najnowszy przykład z dokumentacji Firestore:
firebase.firestore.FieldValue. ArrayUnion
źródło
Przepraszamy za spóźnienie na imprezę, ale Firestore rozwiązało to już w sierpniu 2018 roku, więc jeśli nadal tego szukasz, wszystkie problemy dotyczące tablic zostały rozwiązane.
https://firebase.googleblog.com/2018/08/better-arrays-in-cloud-firestore.html Oficjalny post na blogu
array-zawiera, arrayRemove, arrayUnion do sprawdzania, usuwania i aktualizowania tablic. Mam nadzieję, że to pomoże.
źródło
Aby oprzeć się na odpowiedzi Sama Sterna , istnieje również trzecia opcja co czyniło rzeczy łatwiejsze dla mnie i że jest za pomocą tego, co nazywamy mapą Google, która jest w zasadzie słownika.
Myślę, że słownik jest znacznie lepszy dla opisywanego przypadku użycia. Zwykle używam tablic do rzeczy, które nie są zbytnio aktualizowane, więc są mniej więcej statyczne. Ale w przypadku rzeczy, które są często pisane, w szczególności wartości, które wymagają aktualizacji dla pól, które są powiązane z czymś innym w bazie danych, słowniki okazują się znacznie łatwiejsze w utrzymaniu i pracy z nimi.
Więc w twoim konkretnym przypadku struktura DB wyglądałaby następująco:
Umożliwi to wykonanie następujących czynności:
Powodem definiowania obiektu jako zmiennej jest użycie
'sharedWith.' + whoEmail + '.when'
bezpośrednio w metodzie set spowoduje błąd, przynajmniej podczas używania go w funkcji chmury Node.js.źródło
Poza odpowiedziami wymienionymi powyżej. To wystarczy. Korzystanie z Angular 5 i AngularFire2. lub użyj firebase.firestore () zamiast this.afs
źródło
Potraktuj Johna Doe jako dokument, a nie kolekcję
Daj mu kolekcję rzeczy i rzeczy udostępnianych przez innych
Następnie możesz mapować i wyszukiwać współdzielone elementy Johna Doe w tej równoległej kolekcji thingsSharedWithOthers.
źródło
Jeśli ktoś szuka rozwiązania Java Firestore SDK, aby dodać elementy w polu tablicy:
Aby usunąć elementy z użytkownika tablicy:
FieldValue.arrayRemove()
źródło
źródło