使用 .limitToFirst 或 .limitToLast 仍然 returns Firebase 实时数据库中的全部数据

Using .limitToFirst or .limitToLast still returns the whole data in Firebase Realtime Database

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

[✓] Flutter (Channel dev, v1.13.0, on Mac OS X 10.14.6 18G95, locale en-US)
[✓] Android toolchain - develop for Android devices (Android SDK version 29.0.0)
[✓] Xcode - develop for iOS and macOS (Xcode 10.3)
[✓] Chrome - develop for the web
[✓] Android Studio (version 3.5)
[✓] VS Code (version 1.40.2)
[✓] Connected device (3 available)

• No issues found!



现在我得到了一个看起来像这样的数据库:



我想做的是根据 'timestamp/seconds' 查询艺术品的子项,如下所示:

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.. 请注意,当我执行上面的代码时,我在 return(大约 3KB)中得到 10 个艺术作品子项,但在使用情况中它显示 858.6KB。这意味着它下载了整个艺术作品节点及其所有子节点(加上开销),然后在客户端它将对列表进行排序。

所以问题:
1. 怎么才能真正只下载那10条数据而不是全部获取?
2. Flutter App也是这样吗?

改变这个:

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个项目进行排序。

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