Можно ли получить все документы, чья подколлекция содержит указанный c идентификатор документа? - PullRequest
2 голосов
/ 29 апреля 2020

Я пытаюсь получить все документы, чьи вложенные коллекции содержат указанный c идентификатор документа. Есть какой-либо способ сделать это?

Например, если документ в штучной упаковке в разделе «Запросы» существует, тогда мне нужен идентификатор документа в штучной упаковке из коллекции «книг». Я не мог понять, как go в обратном направлении, чтобы получить идентификатор родительского документа.

Structure of my database

Ответы [ 3 ]

1 голос
/ 29 апреля 2020

Попробуйте следующее:

Firestore.instance.collection("books").where("author", isEqualTo: "Arumugam").getDocuments().then((value) {
  value.documents.forEach((result) {
   var id = result.documentID;
   Firestore.instance.collection("books").document(id).collection("enquiries").getDocuments().then((querySnapshot) {
    querySnapshot.documents.forEach((result) {
      print(result.data);
    });

Сначала вам нужно получить идентификатор из коллекции books, чтобы сделать это, вам нужно выполнить запрос, например where("author", isEqualTo: "Arumugam"). После получения id вы можете выполнить запрос для извлечения документов из коллекции enquiries

0 голосов
/ 29 апреля 2020

Я предполагаю, что все вложенные коллекции имеют одинаковое имя, то есть enquiries. Затем вы можете сделать следующее:

  1. Добавить поле docId в ваш enquiries документ, содержащий идентификатор документа.
  2. Выполнить Запрос группы сбора , чтобы получить все документы с требуемым значением docId (Firestore.instance.collectionGroup("enquiries").where("docId", isEqualTo: "ykXB...").getDocuments()).
  3. Затем вы l oop просмотрите результаты запроса и для каждого DocumentReference, который вы вызываете дважды parent() методы ( первый раз вы получите CollectionReference и второй раз вы получите DocumentReference родительского документа).
  4. Вы просто нужно использовать свойство id , и все готово.
0 голосов
/ 29 апреля 2020

Например, если документ в штучной упаковке в разделе «Запросы» существует, тогда мне нужен идентификатор документа в штучной упаковке из коллекции «книг».

Нет способа, которым вы можете сделать это за один go.

Я не мог понять, как go в обратном направлении, чтобы получить идентификатор родительского документа.

Там не собирается вернуться в Firestore, как вы, вероятно, думали. В базе данных Firebase Realtime у нас есть метод с именем getParent(), который делает именно то, что вы хотите, но в Firestore мы этого не делаем.

Запросы в Firestore являются поверхностными, то есть он получает только элементы из коллекции, которые запрос выполняется Firestore не поддерживает запросы к различным коллекциям в одном go. Один запрос может использовать только свойства документов в одной коллекции. Таким образом, решение вашей проблемы - выполнить два get() вызова. Первый - проверить этот документ на наличие в подколлекции enquiries и, если он существует, просто создать еще один вызов get(), чтобы получить документ из коллекции books.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...