Flutter Firestore развернуть данные документа - PullRequest
0 голосов
/ 08 февраля 2019

У меня есть простое приложение, которое использует Firestore в качестве источника данных.После изучения руководств Google о том, как создать лучшую базу данных, я начал разделять свои объекты на несколько таблиц (или как они называют это коллекции) и использовать ссылки на данные.

Позвольте мне привести простой пример.Допустим, у меня есть две коллекции (таблицы данных)

  • ShoppingCategories
  • ShoppingItems

Логика заключается в том, что в ShoppingItems я могу хранить все предметы независимо от того,категории (например, молоко, хлеб, птица, вино, ...), но в моем ShoppingCategories я создаю категории продуктов (например, дневник, фрукты, мясо, ...) и относящиеся к ним ссылочные позиции.

Вот как будет выглядеть модель данных во Flutter:

class ShoppingCategory {
    DocumentReference reference;
    String title;
    List<ShoppingItem> items;
}

class ShoppingItem {
    DocumentReference reference;
    String title;
}

Проблема, с которой я сейчас сталкиваюсь, заключается в том, что если я сделаю следующий вызов:

Firestore.instance.collection('shopping_categories').snapshot()

Iдействительно получит все категории покупок с недвижимостью items;однако это будет просто тип DocumentReference.Чтобы получить подробную информацию об этих ShoppingItems, мне нужно будет позвонить по номеру Firestore (для каждого и каждого подпункта) и запросить их данные.

Мой вопрос будет следующим:

Есть ли способ, как сделать это более эффективно?Например, если бы я использовал Entity Framework, я бы вызвал метод .expand() в моей коллекции items, и он бы динамически извлекал все необходимые детали - поэтому за один вызов я получаю все детали.Могу ли я сделать что-то подобное в Flutter - Firestore?

1 Ответ

0 голосов
/ 08 февраля 2019

Нет, это невозможно.Firestore не имеет объединений по дизайну, равно как и клиентские SDK.

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

The {} означает идентификатор документа

shopping_categories/{dairy}
  {name: "Dairy"}

items/{milk}
  {
    category: {
      id: "dairy",
      data: {name: "Dairy"}
    },
    name: "Milk"
  }

Поле данных в элементах является необязательным, вы также можете сделать это так:

  {
    category: {
      id: "dairy",
      name: "Dairy"
    },
    name: "Milk"
  }

Таким образом, вы можете запросить его следующим образом:

Firestore.instance.collection('items').where('category.id', isEqualTo: "dairy").getDocuments();

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

Это одно из преимуществ БД документов: вы можете сохранить документ так, чтобы чтение было более эффективным, потому что вам нужно прочитать только один объект вместонесколько.

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