Firestore добавить раздел, чтобы читать только последние данные - PullRequest
0 голосов
/ 25 апреля 2019

В настоящее время я работаю над приложением Flutter, использующим Firebase Cloud Firestore непосредственно с клиента.

На самом деле у меня проблема с правилом чтения моей базы данных Firebase. На самом деле я хотел бы добавить свойство, которое будет считывать только данные, возраст которых менее 5 минут.

Итак,

Это мои текущие правила чтения и записи:

service cloud.firestore {
  match /databases/{database}/documents {
    match /locations/{allDocuments=**} {
      allow read: if request.time.toMillis() >=
             resource.data.timestamp;
      allow write: if true;
    }
  }
}

Это функция, в которой я читаю данные в своем коде флаттера:

void _updateMarkers(List<DocumentSnapshot> documentList) {
    print(documentList);
    markers.clear();
    documentList.forEach(
      (DocumentSnapshot document) {
        final String markerIdVal = 'marker_id_$_markerIdCounter';
        _markerIdCounter++;
        final MarkerId markerId = MarkerId(markerIdVal);
        setState(() {
          GeoPoint pos = document.data['position']['geopoint'];
          var marker = Marker(
              markerId: markerId,
              position: LatLng(pos.latitude, pos.longitude),
              icon: BitmapDescriptor.fromAsset('assets/ticket_point.png'),
              infoWindow:
                  InfoWindow(title: 'Ici à :', snippet: document.data['time']));
          markers[markerId] = marker;
        });
      },
    );

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

Заранее спасибо!

1 Ответ

0 голосов
/ 27 апреля 2019

Вы очень близко подошли к правилам безопасности.То, что вы ищете, это глобальное длительное пространство имен , не нужно toMillis().

service cloud.firestore {
  match /databases/{database}/documents {
    match /locations/{allDocuments=**} {
      allow read: if request.time - duration.value(5, 's') >= resource.data.timestamp;
      allow write: if true;
    }
  }
}

Это говорит "если запрос для документов с отметкой времени между сейчас и 5секунд назад, разрешите его чтение.

Правила безопасности не действуют как фильтр, поэтому вам потребуется запрос, который запрашивает только последние данные, и, поскольку устройство вашего клиента, скорее всего, не синхронизированос Google вам также потребуется рассмотреть что-то вроде облачной функции для получения текущего времени. [Вы также можете рассмотреть службу Google Public NTP , но у нее нет SLA].

...