#angular #firebase #google-cloud-firestore #firebase-security #angularfire2
#angular #firebase #google-облако-firestore #firebase-безопасность #angularfire2
Вопрос:
Сегодня я узнал, что вы можете создать 2 разных объекта в коллекции с одинаковым идентификатором. Изначально я пытался обновить существующий документ, идентификатор которого равен some-id, вот так
const ref = this.db.doc(`collectionName/some-id`);
await ref.set(obj, {merge: true});
obj здесь является подмножеством того, что содержит объект на сервере.
Изначально я хотел добавить новое свойство к существующему объекту.
В итоге я получил два разных объекта с одинаковым идентификатором. Один из них — старый, который у меня уже был, а другой — тот, который я пытался объединить с существующим.
Как это возможно, что Google Firestore разрешает дублирование идентификатора в коллекции? Или я что-то недопонимаю?
Комментарии:
1. Это невозможно. Пожалуйста, отредактируйте вопрос, чтобы более конкретно проиллюстрировать то, что вы наблюдаете, чтобы мы все могли согласиться с тем, что на самом деле произошло.
2. Да, вы правы. Я описал, что произошло, как решение и что нужно сделать, чтобы избежать этого
Ответ №1:
Хорошо, я нашел решение после того, как опубликовал вопрос. У меня есть форма, из которой пользователь может создать объект и выбрать его идентификатор.
При вводе идентификатора был пробел, который не отображался в консоли Fire store. что создает впечатление, что они одинаковые.
Мораль истории: запустите trim () для ваших идентификаторов, если вы разрешаете пользователю вводить идентификатор документа.
Комментарии:
1. Лучшая мораль: не позволяйте пользователям создавать идентификаторы документов. Это, скорее всего, будет очень неэффективно — например, недостаточно рандомизировано и распределено для хорошей индексации. ГОРАЗДО, намного лучше позволить Firestore создавать идентификаторы и добавлять пользовательский выбор в качестве поля в документе.
2. Ну, это не разрешено для конечных пользователей. только администраторам, которым необходимо создавать объекты с определенными идентификаторами, чтобы позже мы могли запрашивать их напрямую. Но да, даже при осторожных пользователях следует ожидать человеческой ошибки
3. Абсолютно нет необходимости вручную создавать идентификатор документа, чтобы иметь возможность его найти, поскольку вы можете запросить в любом поле. пусть ввод «user» (даже admin) будет полем в документе — на самом деле нет необходимости показывать его какому-либо пользователю; просто используйте его для запроса. Пусть Firestore делает свое дело.
4. Я никогда не говорил, что это необходимо. Это дизайнерский выбор — выбирать идентификаторы в качестве электронных писем, например, чтобы избежать дубликатов, а затем запрашивать пользователя напрямую как doc (‘users/someEmail@gmail.com ‘), который возвращает один объект вместо коллекций (‘users’).где(’email’,’==’, ‘someEmail’)
5. Опять же, на самом деле это не выбор дизайна — распределение идентификаторов абсолютно критично и фундаментально для того, как Firestore способен масштабироваться. Я гарантирую, что вы серьезно снизите производительность приложения Firestore, если будете настаивать на использовании электронных писем в качестве идентификатора документа. И проверять наличие документа с помощью запроса НЕ МЕНЕЕ ЭФФЕКТИВНО, чем с помощью .doc(). ИТАК: никаких преимуществ и много-много плохих последствий. Почему вы настаиваете на том, чтобы делать это таким образом?