Firestore添加了条件以仅读取最新数据

时间:2019-04-25 17:05:11

标签: firebase dart flutter timestamp google-cloud-firestore

我目前正在直接从客户端使用Firebase Cloud Firestore开发Flutter应用。

实际上,我的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;
    }
  }
}

这是我在Flutter代码中读取数据的函数:

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 :(得分:0)

您在安全规则方面非常接近。您正在寻找的是全局duration namespace,不需要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]。