#javascript #google-cloud-firestore
#javascript #google-облако-firestore
Вопрос:
Структура моего документа:
candy : {
Mars: {
batches: {
'aaa': { id: 'aaa', expires: 'tomorrow' },
'bbb': { id: 'bbb', expires: 'in a week' }
},
category: 'Chocolate',
name: 'Mars',
}
},
и чтобы добавить новую конфету, Haribo
я хотел бы добавить ее следующим образом:
const name = 'Haribo';
const category = 'not-chocolate'
const batch = {
id: 'ccc',
expires: 'in 2 years'
}
admin
.firestore()
.collection('shop')
.doc(MY_SHOP)
.update({
[`candy.${name}`]: {
name,
category,
[`candy.${name}.batches.${batch.id}`]: batch
}
});
Однако, если я сделаю это и Haribo
уже существует и имеет несколько пакетов, то приведенный выше код перезапишет все. Поэтому мне пришлось разделить его на два разных вызова firestore. Первый обновляет только name
и category
, второй вызов обновляет объект batches.
Есть ли у меня способ обновить что-то настолько глубокое [
candy.${name}.batches.${batch.id } ]
без перезаписи существующих пакетов?
Ответ №1:
Вы можете использовать транзакцию для чтения всего документа, внесения изменений в его структуру документа в памяти любым удобным вам способом (добавление / удаление / обновление любых полей или вложенных карт), а затем записать весь документ обратно в конце транзакции.
Возможно, было бы даже лучше хранить каждую партию (и даже каждую конфету) как отдельный документ во вложенной коллекции, чтобы упростить это и увеличить ваши возможности для запроса данных в отдельных пакетах.
Комментарии:
1. Спасибо. Если бы у меня был документ для каждого пакета, то при добавлении 5 новых пакетов это не будет считаться 5-кратной записью в базу данных? Это плохо? Еще раз спасибо
2. Если у вас есть новый вопрос, пожалуйста, разместите его отдельно вместе с кодом, с которым вы работаете, и поведением, в котором вы не уверены.
3. …почему… это вопрос о вашем ответе …?!
4. Переполнение стека имеет политику одного вопроса на сообщение. В будущем другим будет полезнее, если для отдельных вопросов будет отдельный пост, чтобы информация не скрывалась в комментариях. Пожалуйста, отправьте новый вопрос и обрисуйте сценарий вашего нового вопроса.
5. Итак, я копирую свой первоначальный вопрос, затем ваш ответ, затем мой вопрос из вашего ответа в новый вопрос? Я удивлен, что вы не видите неэффективности…