如何在 firebase 中加载前 50 个对象,停止加载然后过滤结果?
How to load first 50 objects in firebase, stop the loading and then filter results?
我的 Firebase 数据库超过 800mb,包含超过 100.000 个对象(新闻文章)。
我想要做的是只获取前 50 个对象(最近的),然后根据子参数对从第一个查询结果中获得的对象进行排序。
因此,例如,当加载页面时,我需要 angularfire / firebase 只加载前 50 个对象并停止加载数据库中的其余对象。然后,我想根据节点 category
music
.
过滤掉这50个对象(文章)
到目前为止,我的第一个查询似乎没问题(但如果有更好的方法让 firebase 加载 X 对象并停止,我将不胜感激)。但是,第二部分,我无法弄清楚,因为 firebase 抛出了一个错误。
错误是:
Query: Can't combine startAt(), endAt(), and limit(). Use limitToFirst() or limitToLast() instead
这是我的示例代码:
var myArticlesRef = new Firebase(FIREBASE_URL + 'articles/');
var latestArticlesRef = myArticlesRef.limitToFirst(20); // is this the recommended way to ask firebase to stop
var latestArticlesOrder = latestArticlesRef.orderByChild('category').equalTo(‘Music’); // <- how to do something similar?
var latestArticlesInfo = $firebaseArray(latestArticlesOrder);
$scope.latestArticles = latestArticlesInfo;
console.log($scope.latestArticles);
这应该有效:
var query = myArticlesRef.orderByChild('category').equalTo(‘Music’).limitToFirst(20);
所以您要求 Firebase return 音乐类别中的前 20 篇文章。
虽然从 relational/SQL 的心态来看这样的查询很常见,但我建议您考虑这种替代数据结构:
articles_by_category
music
article1: { }
article2: { }
article3: { }
...
technology
article4: { }
...
因此,与其将文章存储在一个大列表中,不如按类别存储它们。访问有关音乐的文章的方式,您只需要做:
var query = ref.child('articles_by_category').child('music').limitToFirst(20);
使用这种方法,数据库不必执行任何查询,并且可以扩展到更多的用户。
这是您在 NoSQL 世界中经常看到的事情:您最终会按照应用程序查询数据的方式对数据进行建模。有关精彩介绍,请参阅此 article on NoSQL data modeling. Also read the Firebase documentation on data modeling and indexes.
我的 Firebase 数据库超过 800mb,包含超过 100.000 个对象(新闻文章)。 我想要做的是只获取前 50 个对象(最近的),然后根据子参数对从第一个查询结果中获得的对象进行排序。
因此,例如,当加载页面时,我需要 angularfire / firebase 只加载前 50 个对象并停止加载数据库中的其余对象。然后,我想根据节点 category
music
.
到目前为止,我的第一个查询似乎没问题(但如果有更好的方法让 firebase 加载 X 对象并停止,我将不胜感激)。但是,第二部分,我无法弄清楚,因为 firebase 抛出了一个错误。 错误是:
Query: Can't combine startAt(), endAt(), and limit(). Use limitToFirst() or limitToLast() instead
这是我的示例代码:
var myArticlesRef = new Firebase(FIREBASE_URL + 'articles/');
var latestArticlesRef = myArticlesRef.limitToFirst(20); // is this the recommended way to ask firebase to stop
var latestArticlesOrder = latestArticlesRef.orderByChild('category').equalTo(‘Music’); // <- how to do something similar?
var latestArticlesInfo = $firebaseArray(latestArticlesOrder);
$scope.latestArticles = latestArticlesInfo;
console.log($scope.latestArticles);
这应该有效:
var query = myArticlesRef.orderByChild('category').equalTo(‘Music’).limitToFirst(20);
所以您要求 Firebase return 音乐类别中的前 20 篇文章。
虽然从 relational/SQL 的心态来看这样的查询很常见,但我建议您考虑这种替代数据结构:
articles_by_category
music
article1: { }
article2: { }
article3: { }
...
technology
article4: { }
...
因此,与其将文章存储在一个大列表中,不如按类别存储它们。访问有关音乐的文章的方式,您只需要做:
var query = ref.child('articles_by_category').child('music').limitToFirst(20);
使用这种方法,数据库不必执行任何查询,并且可以扩展到更多的用户。
这是您在 NoSQL 世界中经常看到的事情:您最终会按照应用程序查询数据的方式对数据进行建模。有关精彩介绍,请参阅此 article on NoSQL data modeling. Also read the Firebase documentation on data modeling and indexes.