首页 > 解决方案 > 使用 .limitToFirst 或 .limitToLast 仍会返回 Firebase 实时数据库中的全部数据

问题描述

首先,我是 Stackoverflow 和 Flutter Web 编码的新手。这是我的 Flutter 医生:

[✓] Flutter (Channel dev, v1.13.0, on Mac OS X 10.14.6 18G95, locale en-US)
[✓] Android 工具链 - 为 Android 设备开发 (Android SDK 版本 29.0.0)
[✓] Xcode - 开发适用于 iOS 和 macOS (Xcode 10.3)
[✓] Chrome - 为网络开发
[✓] Android Studio(3.5 版)
[✓] VS Code(1.40.2 版)
[✓] 已连接设备(3 个可用)

• 未发现问题!



现在我有一个看起来像这样的数据库: 我想做的是根据它的“时间戳/秒”查询艺术品的孩子,如下所示:

实时数据库数据集



fbDB = database();
fbArtworkRef = fbDB.ref('artworks');

await fbArtworkRef
    .orderByChild('last_updated/seconds')
    .limitToLast(10)
    .once(('value'))
    .then((value) {
  value.snapshot.forEach((child) {
    print(child.val());
  });
});

看下面的图片:

实时使用

所以整个数据是 843.9KB。请注意,当我执行上面的代码时,我得到了 10 个艺术品子作为回报(大约 3KB),但在使用中它显示 858.6KB。这意味着它下载了整个艺术品节点及其所有子节点(加上开销),然后在客户端它将对列表进行排序。

所以问题是:
1. 我怎么能真的只下载这 10 条数据而不是获取所有数据?
2. Flutter App 也是一样的行为吗?

标签: firebaseflutterfirebase-realtime-databasedartflutter-web

解决方案


改变这个:

fbDB = database();
fbArtworkRef = fbDB.ref('artworks');

await fbArtworkRef
    .orderByChild('last_updated/seconds')
    .startAt(1572370553)
    .once(('value'))
    .then((value) {
  value.snapshot.forEach((child) {
    print(child.val());
  });
});

进入这个:

fbDB = database();
fbArtworkRef = fbDB.ref('artworks');

await fbArtworkRef
    .orderByChild('last_updated/seconds')
    .equalTo(1560908950)
    .once(('value'))
    .then((value) {
  value.snapshot.forEach((child) {
    print(child.val());
  });
});

https://github.com/FirebaseExtended/flutterfire/blob/master/packages/firebase_database/lib/src/query.dart#L137


推荐阅读