#swift #firebase #google-cloud-firestore
# #google-облако-firestore #firebase-консоль
Вопрос:
Может кто-нибудь мне это объяснить. Я работаю со скриптом резервного копирования node-firestore-backup-restore-master для Firestore из github. Заработало, но оно считывает только один документ из списка документов, которые у меня есть в коллекции. Тот, который он читает, написан обычным текстом, остальные выделены курсивом, а в сообщении для выделенных курсивом указано, что они не существуют и не будут отображаться в запросах.
Они существуют, а также связанные с ними документы и поля, которые появляются при запросе из моего приложения для IOS, но не из Node.js сценарий резервного копирования.
Есть мысли?? Дэйв
Ответ №1:
Если вы создаете документы с вложенными документами, а затем удаляете документ верхнего уровня из SDK, удаление не является рекурсивным. Таким образом, пока документ верхнего уровня отсутствует, его вложенные документы остаются.
Идентификаторы документов для них отображаются в пользовательском интерфейсе в виде выделенных курсивом идентификаторов: на самом деле эти документы не существуют, но мы показываем их, чтобы вы могли перейти к вложенным коллекциям.
Поскольку документа больше нет, сам документ не будет отображаться в результатах запроса. Если вам нужно найти этот документ в результатах запроса, вы захотите создать пустой документ в качестве обходного пути.
Если вам нужно получить эти несуществующие документы через API, единственный способ сделать это — выполнить запрос группы коллекций к вложенной коллекции и определить родительские документы оттуда.
Комментарии:
1. Можете ли вы добавить какие-либо рекомендации для решения этих сценариев? Как получить эти документы программно (используя cronjob для их удаления или переназначения)? Любые мысли были бы полезны
2. Да, я столкнулся именно с этой проблемой и исправил ее, выполнив рекурсивную операцию пакетного удаления.. (На более глубоком уровне вы можете перенести эту рекурсивную операцию пакетного удаления в функции firebase cloud, чтобы она выполнялась в облаке, в то время как ваше интерфейсное приложение никоим образом не пострадало)
3. Я не думаю, что есть API, который получает «все ссылки на документы, которые имеют только вложенные коллекции». Вместо этого я бы рекомендовал противоположный подход: удалите все вложенные коллекции при удалении их «содержащего» документа.
Ответ №2:
В firestore документы выделены курсивом из-за,
- удалить коллекцию или документ с вложенной коллекцией, вложенными документами.
- Добавление коллекции и документов в пустой документ.
Документы, выделенные курсивом, не отображаются в вашем приложении, они не могут быть извлечены, единственный способ сделать это — напрямую указать точный путь и имя документа.
РЕШЕНИЕ:
вместо добавления только одной коллекции в пустой документ, добавьте одно пустое поле в этот документ перед добавлением коллекции.
В Android я добавляю в поле пустую хэш-карту. но в базе данных не будет показан мой пример кода:
Map<String ,Object> dummyMap= new HashMap<>();
DocumentReference df=db.collection("col1").document("doc1");
df.set(dummyMap); // add empty field, wont shown in console
df.collection("your collection name");
Макет и ваша коллекция находятся в одном документе «doc1».
Комментарии:
1. Было очень полезно узнать пункт № 2 о том, что добавление коллекции и документов в пустой документ приведет к такому результату. Спасибо!
Ответ №3:
Это происходит в двух случаях:
- если вы удалите документы с вложенными коллекциями
- если вы создаете напрямую что-то вроде «/ collection / document (1) / collection / document (2)» вместо того, чтобы создавать его в два этапа:
- шаг 1. создайте: /collection/document(1)
- шаг 2. создайте: /коллекция / документ (1)/коллекция / документ (2)
И похоже, что если вы находитесь в любом из этих случаев, вы не можете перечислить «document (1)», что является довольно странным способом работы, потому что они не существуют как «документы» (так они отмечены «курсивом»), но они «существуют» как ссылки на вложенные коллекции.
Комментарии:
1. Это ситуация, в которой я нахожусь: документы никогда не удалялись, а были созданы как ссылки на другие документы. Насколько я понимаю, это ошибка в Android и должна быть исправлена.