【问题标题】:Using .limitToFirst or .limitToLast still returns the whole data in Firebase Realtime Database使用 .limitToFirst 或 .limitToLast 仍会返回 Firebase 实时数据库中的全部数据
【发布时间】:2020-04-08 15:20:20
【问题描述】:

首先,我是 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 也是一样的行为吗?

【问题讨论】:

    标签: firebase flutter firebase-realtime-database dart flutter-web


    【解决方案1】:

    改变这个:

    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

    【讨论】:

    • 感谢您的回答,但我想要那 10 个孩子(而不是一个)。
    • 你想要哪10个孩子?
    • child.val() 会给你10个孩子
    • 我不确定这是否真的只是从云端返回一个数据,或者它返回所有数据然后在客户端它会削减其余部分。
    • 对不起,如果我的问题不够清楚,但在我上面的问题中,我已经解释了.. 这不是归还 10 个孩子。我知道如何得到这 10 个孩子,我得到了它。但是,当我在使用量表中(在 Firebase 控制台中)获得 10 个孩子时,它会显示下载的整个节点的大小,而不是仅 10 个(应该是 90KB 左右而不是 858KB)
    【解决方案2】:

    它必须下载整个数据的原因是因为您想在限制之前进行排序。系统要进行排序,需要下载整个数据然后进行排序。

    但是,如果您要先限制再排序,它只会下载前 10 个项目,并且只对这 10 个项目进行排序。

    解决方案:如果您真的想根据子值对整个列表进行排序,则没有解决方法,因此您必须坚持这一点,或者更改您的数据结构以按年/月分类

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-28
      • 2018-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-27
      • 2019-05-15
      相关资源
      最近更新 更多