Рекомендации Firebase Firestore v9: игнорирование определенных свойств по сравнению с условным addDoc/updateDoc

# #javascript #firebase #google-cloud-firestore

Вопрос:

Эй, я только что обновил свой проект, чтобы использовать модульную версию Firebase 9. Теперь, после рефакторинга кода, мне интересно, как получить желаемый результат:
есть документ, в котором есть пара обязательных полей (скажем, имя, фамилия). Теперь я хочу добавить/обновить этот документ, но в нем есть несколько полей, которые не требуются.

Каковы наилучшие методы для достижения этой цели? Для условного добавления/обновления [1] или для использования «ignoreUndefinedProperties» [2]?

[1] условное добавление/обновление…

 if(address){
  await updateDoc(
    doc(db, collection, id), {
      name,
      lastName,
      address,
    })
} else {
  await updateDoc(
    doc(db, collection, id), {
      name,
      lastName,
    })
}
 

[2] Игнорируйте определенные свойства…

Также я не смог найти документацию о том, как использовать «ignoreUndefinedProperties» в новой версии, чтобы кто-нибудь мог подсказать мне правильное использование.

РЕДАКТИРОВАТЬ (Также является ли это (добавление РЕДАКТИРОВАНИЯ) лучшим способом продолжить и уточнить мой вопрос? Я новичок, поэтому я также ищу лучшие практики StackOverflow)

Я тестирую требуемые значения, но как мне поступить со значениями, которые не требуются?
У меня есть несколько коллекций и 20 вызовов к ним, и во многих требуется только 2-4 значения, в то время как может быть 20 неиспользованных значений.
Таким образом, я получаю следующую ошибку, если какое-либо из этих неиспользованных значений не определено и находится в updateDoc()…

 Function updateDoc() called with invalid data. Unsupported field value: undefined (found in field exampleNotRequiredValue in document ...)
 

Так что для этого случая лучше ли
[1] проверьте, не являются ли значения неопределенными, и в этом случае добавьте их в объект обновления
[2] используйте свойства ignoreUndefinedProperties (так как не в этом ли смысл этого параметра, не выполняется ли эта проверка автоматически, и мне не нужно изменять многие функции?)

Ответ №1:

"ignoreUndefinedProperties" возможно, это не лучший вариант. Если имя требуется, но не определено по какой-либо причине, то оно не будет записано в документ. Вы можете написать правила безопасности, которые проверят наличие name полей и nickname , но лучше всего будет условно добавить поля в объект обновления и убедиться, что необходимые поля присутствуют.

В случае , если вы хотите использовать ignoreUndefinedProperties , вам придется использовать initializeFirestore вместо getFirestore :

 import { initializeFirestore } from "firebase/firestore"

const db = initializeFirestore(app, {ignoreUndefinedProperties: true})
 

Комментарии:

1. Почему лучше добавлять поля условно для обновления объекта, чем просто использовать свойства ignoreUndefinedProperties, потому что параметр игнорировать автоматически не уменьшает код, необходимый для написания?

2. @Hessuew Я уже объяснял это в ответе. Если требуемое » имя » по какой-либо причине не определено, оно не будет добавлено в документ. Таким образом, технически это не обязательное поле, если вы не добавите проверку того, что оно определено, то использование ignoreUndefinedProperties не должно быть проблемой.

3. Ах, вы правы, я задал неправильный вопрос (конечно, обязательные поля должны быть проверены, они присутствуют и имеют значение). Я добавлю прямой вопрос к своему исходному вопросу в качестве редактирования, чтобы указать, что я имею в виду