Поиск всех документов с конкретной ссылкой в ​​Cloud Firestore

В Cloud Firestore у меня есть документы со ссылкой на другой документ следующим образом:

«Ссылка

В моем примере документ Collection A/WJQ9yx67RrqHWQoEp0e2 относится к документу Collection B/rFOEwdw5go4dbitOCXyC, но там, конечно, может быть бесконечное количество документов, относящихся к одному из упомянутых.

Теперь я хотел бы узнать все документы Collection A, которые относятся к этому очень специфическому документу Collection B/rFOEwdw5go4dbitOCXyC.

Как это возможно? Как я могу этого добиться?

Документация Firebase немного неясна.


person Petja    schedule 25.10.2017    source источник
comment
Какой язык вы используете?   -  person Grimthorr    schedule 25.10.2017
comment
Лично я использую JavaScript в Интернете. Но я думаю, что этот вопрос обычно охватывает все языки, поддерживаемые Firebase.   -  person Petja    schedule 25.10.2017


Ответы (1)


Вы правы, к сожалению, в документации нет примера фактического использования типа данных Reference, на самом деле единственное упоминание о нем есть в раздел Поддерживаемые типы данных.

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

Чтобы добиться желаемого, вам нужно будет создать Reference, который указывает на документ в Collection B, а затем использовать предложение where для фильтрации данных по reference значению Collection A. Например, в JavaScript:

// Create a reference to the specific document you want to search with
var reference = db.collection("Collection B").doc("rFOEwdw5go4dbitOCXyC");

// Construct a query that filters documents matching the reference
var query = db.collection("Collection A").where("reference", "==", reference);

Глядя на isEqual() в Firebase JavaScript SDK сравнение Reference (расширяет Query) выполняется простой проверкой совпадения путей:

  isEqual(other: Query): boolean {
    // [...]
    const sameRepo = this.repo === other.repo;
    const samePath = this.path.equals(other.path);
    const sameQueryIdentifier =
      this.queryIdentifier() === other.queryIdentifier();

    return sameRepo && samePath && sameQueryIdentifier;
  }

Это похоже на вызов toString() на обоих и сравнение строковых значений.

Вчера я создал аналогичный пример, который побудил меня протестировать возможные варианты использования хранения Reference, так что он также может применяться здесь.

person Grimthorr    schedule 25.10.2017
comment
Большое спасибо, у меня все заработало! В конце концов, решение оказалось проще, чем я думал :) - person Petja; 25.10.2017