Firestore: обновление различных вложенных объектов

#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. Итак, я копирую свой первоначальный вопрос, затем ваш ответ, затем мой вопрос из вашего ответа в новый вопрос? Я удивлен, что вы не видите неэффективности…