Невозможно получить документы с вложенными коллекциями. - PullRequest
0 голосов
/ 31 октября 2018

У меня есть древовидная структура с вложенными коллекциями, которые я могу строить, вставлять объекты и извлекать из них, но я не могу перечислить документы в середине. Дерево выглядит как

/TimeEntries/2018/2018-10/2018-10-15/Events
/TimeEntries/2018/2018-10/2018-10-22/Events

В приведенном выше примере 2018 является документом, 2018-10 является вложенной коллекцией, а 2018-10-15 и 2018-10-22 являются документами с Events вложенными коллекциями.

Это сделано с чем-то вроде

func SaveEvents(week time.Time, events []Event) {
    colref := client.Collection("TimeEntries").Doc(week.Format("2006")).Collection(week.Format("2006-01")).Doc(week.Format("2006-01-02")).Collection("Events")
    batch := client.Batch()

    for _, event := range events {
        batch.Set(colref.Doc(strconv.Itoa(event.Id)), event)
    }
    if _, err := batch.Commit(context.Background()); err != nil {
        log.Fatalf("unable to create event docs: %v", err)
    }
}

Бывают случаи, когда мне нужны события по неделям и события по месяцам. Я могу получать события по неделям прямо сейчас, но чтобы получить события по месяцам, мне нужно получить список документов в середине дерева, а затем получить документы их подколлекций. К сожалению, попытка перечислить документы в середине дерева не работает; это всегда регистрируется 0 events:

func FetchEventsForMonth(week time.Time) {
    colref := client.Collection("TimeEntries").Doc(week.Format("2006")).Collection(week.Format("2006-01"))

    snaps, err := colref.Documents(context.Background()).GetAll()
    if err != nil {
        log.Printf("cannot fetch docs: %v", err)
        return
    }

    log.Printf("%d events", len(snaps))
}

Я не вижу ничего в документации, объясняющей это поведение. Чего мне не хватает?

1 Ответ

0 голосов
/ 31 октября 2018

Когда вы используете следующую ссылку коллекции:

colref := client.Collection("TimeEntries").Doc(week.Format("2006")).Collection(week.Format("2006-01"))

Это означает, что вы получаете из базы данных только документы в коллекции 2006-01 и только эти документы, не более того. К сожалению, в Firestore нет возможности также получить все документы в коллекции Events, которая является вложенной коллекцией в документе 2006-01-02 в одном запросе. Запросы в Firestore мелкие: они получают только элементы из коллекции, с которой выполняется запрос. Невозможно получить документы из другой коллекции верхнего уровня и других коллекций или вложенных коллекций в одном запросе. Firestore не поддерживает запросы к различным коллекциям за один шаг. Один запрос может использовать только свойства документов в одной коллекции.

Если вы хотите запросить в базе данных Cloud Firestore документы в одной коллекции по documentId, вы можете добиться этого, используя FieldPath.documentId(), например:

client.collection.where(firebase.firestore.FieldPath.documentId(), '<', 'yourDate').get();

Но имейте в виду, что идентификаторы документов String и, следовательно, сюда будут входить документы с идентификатором, например 2018-10-15 или 2018-10-22. Поэтому, когда вы заказываете строки, результат упорядочивается лексикографически, и я думаю, что это не то, что вы хотите. Поэтому, если вы хотите запросить коллекцию по числовым значениям, вам нужно записать идентификатор документа в виде числового значения.

Но наиболее эффективным решением в этом случае было бы упростить вашу базу данных, создав одну коллекцию, содержащую event документов, и добавить под каждым объектом события свойство даты, чтобы вы могли запрашивать базу данных в соответствии с ней. В этом случае вы можете использовать все функции, которые предоставляет Firestore SDK, и фильтровать сравнение диапазонов (<, <=,>,> =).

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