В настоящее время я пробую Firestore, и я застрял в чем-то очень простом: «обновлении массива (также известного как вложенный документ)».
Моя структура БД очень проста. Например:
proprietary: "John Doe",
sharedWith:
[
{who: "first@test.com", when:timestamp},
{who: "another@test.com", when:timestamp},
],
Я пытаюсь (безуспешно) продвигать новые записи в shareWith
массив объектов.
Я пробовал:
// With SET
firebase.firestore()
.collection('proprietary')
.doc(docID)
.set(
{ sharedWith: [{ who: "third@test.com", when: new Date() }] },
{ merge: true }
)
// With UPDATE
firebase.firestore()
.collection('proprietary')
.doc(docID)
.update({ sharedWith: [{ who: "third@test.com", when: new Date() }] })
Ничего не работает. Эти запросы перезаписывают мой массив.
Ответ может быть простым, но я не мог его найти ...
источник
arrayUnion
методом.Firestore теперь имеет две функции, которые позволяют обновлять массив, не перезаписывая все это целиком.
Ссылка: https://firebase.google.com/docs/firestore/manage-data/add-data , в частности https://firebase.google.com/docs/firestore/manage-data/add-data#update_elements_in_an_array
источник
Вы можете использовать транзакцию ( https://firebase.google.com/docs/firestore/manage-data/transactions ), чтобы получить массив, нажать на него и затем обновить документ:
источник
documentReference
добавления,userRef
как показано:transaction.set(userRef, { bookings: [booking] });
Вот последний пример из документации Firestore:
firebase.firestore.FieldValue. ArrayUnion
источник
Извините, поздно для вечеринки, но Firestore решил это еще в августе 2018 года, поэтому, если вы все еще ищете, здесь все проблемы, связанные с массивами, решены.
https://firebase.googleblog.com/2018/08/better-arrays-in-cloud-firestore.html Официальное сообщение в блоге
array-contains, arrayRemove, arrayUnion для проверки, удаления и обновления массивов. Надеюсь, поможет.
источник
Чтобы основываться на ответе Сэма Стерна , есть также третий вариант, который упростил мне задачу, и это использование того, что Google называет картой, которая по сути является словарем.
Я думаю, что словарь намного лучше для описываемого вами варианта использования. Я обычно использую массивы для вещей, которые на самом деле не слишком сильно обновляются, поэтому они более или менее статичны. Но для того, о чем пишут много, особенно о значениях, которые необходимо обновить для полей, связанных с чем-то еще в базе данных, словари намного проще поддерживать и работать с ними.
Итак, для вашего конкретного случая структура БД будет выглядеть так:
Это позволит вам сделать следующее:
Причина определения объекта как переменной заключается в том, что использование его
'sharedWith.' + whoEmail + '.when'
непосредственно в методе set приведет к ошибке, по крайней мере, при его использовании в облачной функции Node.js.источник
Кроме ответов, упомянутых выше. Это сделает это. Используя Angular 5 и AngularFire2. или используйте firebase.firestore () вместо this.afs
источник
Считайте Джона Доу документом, а не коллекцией
Дайте ему коллекцию вещей и вещей
Затем вы можете сопоставить и запросить общие вещи Джона Доу в этой параллельной коллекции thingsSharedWithOthers.
источник
Если кто-то ищет решение Java firestore sdk для добавления элементов в поле массива:
Чтобы удалить элементы из массива, пользователь:
FieldValue.arrayRemove()
источник
источник