Запрос Firestore для вложенных коллекций в удаленном документе - PullRequest
0 голосов
/ 21 января 2019

При использовании консоли Firebase можно просматривать все документы и коллекции, даже подколлекции, где путь содержит «документы», которых не существует.

Это показано на картинке, включенной здесь, и как указано в документации и на скриншоте. Эти документы не будут отображаться в запросах или снимках. Итак, как консоль находит эти вложенные подколлекции, когда запрос не возвращает их? Picture showing the Firebase console

Можно ли как-нибудь перечислить эти документы. Поскольку консоль может это сделать, похоже, должен быть способ. И если можно найти эти документы, возможно ли создать запрос, который выбирает все документы, которые не существуют, но ограничиваются теми, которые имеют вложенную вложенную коллекцию? (Поскольку множество всех несуществующих документов будет бесконечным)

Ответы [ 2 ]

0 голосов
/ 14 марта 2019

Admin SDK предоставляет метод listDocuments с этим описанием:

Возвращенные ссылки на документы могут включать ссылки на «отсутствующие» документы ", то есть местоположения документов, в которых нет документа, но которые содержат подколлекции с документами. Попытка прочитать такую ссылка на документ (например, через .get () или .onSnapshot ()) вернет DocumentSnapshot, свойство .exists которого имеет значение false.

Объединяя это с примером для перечисления подколлекций , вы можете сделать что-то вроде следующего:

// Admin SDK only
let collectionRef = firestore.collection('col');

return collectionRef.listDocuments().then(documentRefs => {
   return firestore.getAll(documentRefs);
}).then(documentSnapshots => {
   documentSnapshots.forEach(doc => {
      if( !doc.exists ) {
        console.log(`Found missing document: ${documentSnapshot.id}, getting subcollections`);
        doc.getCollections().then(collections => {
          collections.forEach(collection => {
            console.log('Found subcollection with id:', collection.id);
          });
        });
      }
   });
});

Обратите внимание, что в Firebase CLI используется другой подход. Через API REST он запрашивает все документы, расположенные ниже заданного пути, без необходимости сначала знать их конкретное местоположение. Вы можете увидеть, как это работает в коде рекурсивного удаления здесь .

0 голосов
/ 21 января 2019

Можно ли создать запрос, который извлекает все эти вложенные коллекции, вложенные в несуществующий документ.

Запросы в Firestore являются мелкими, что означает, что они получают только элементы из коллекции, для которой выполняется запрос. В Cloud Firestore невозможно получить документы из коллекции верхнего уровня и других коллекций или вложенных коллекций в одном запросе. Firestore не поддерживает запросы к различным коллекциям за один раз. В одном запросе могут использоваться только свойства документов в одной коллекции или вложенной коллекции.

Таким образом, в вашем случае, даже если один документ не существует (не содержит никаких свойств), вы все равно можете запросить коллекцию, которая находится под ним. Другими словами, вы можете запросить вложенную коллекцию queue, существующую в документе -LFNX ... 7UjS, но вы не можете запросить всю коллекцию queue во всех документах. Вы можете запросить только одну вложенную коллекцию за раз.

Edit:

Согласно вашему комментарию:

Я хочу найти коллекции, вложенные в несуществующие документы.

Невозможно найти коллекцию s , поскольку вы не можете выполнять запросы к различным коллекциям. Вы можете только запрос к одному. Самое простое решение, о котором я могу подумать, это проверить, не существует ли документ в вашей коллекции items (не имеет свойств), а затем создать запрос (items -> documentId -> queue) и проверить, есть ли какие-либо результаты.

Edit2:

Консоль Firebase сообщает вам через идентификаторы документов, показанные курсивом , что эти документы просто не существуют. Эти документы не существуют, потому что вы их вообще не создавали. То, что вы сделали, было только , чтобы создать вложенную коллекцию под документом, который никогда прежде не существовал. Другими словами, он просто «резервирует» идентификатор документа в этой коллекции, а затем создает под ним коллекцию. Как правило, вы должны создавать только подколлекции документов, которые на самом деле do существуют, но именно так выглядит, когда документ не существует.

В Cloud Firestore документы и вложенные коллекции не работают, как файлы и каталоги файловой системы, которые вы используете. Если вы создаете вложенную коллекцию под документом, она не подразумевает создание каких-либо родительских документов. Подколлекции никак не связаны с родительским документом. Другими словами, в этом месте нет физического документа , но есть другие данные под этим местоположением.

В консоли Firebase эти идентификаторы документов отображаются на экране, так что вы можете перемещаться по дереву и получать вложенные коллекции и документы, которые существуют под ним. Но в то же время консоль предупреждает вас о том, что этот документ не существует, отображая их идентификаторы в курсив . Таким образом, вы не можете отображать или использовать их из-за простого факта, что под ним нет данных. Если вы хотите исправить это, вы должны написать хотя бы свойство, которое может содержать значение. Таким образом, в этих документах будут храниться некоторые данные, поэтому вы сможете делать все, что захотите.

P.S. В Cloud Firestore, если вы удалите документ, его подколлекции продолжат существовать, и это происходит по той же причине, о которой я упоминал выше.

...