如何在firebase中加载前50个对象,停止加载然后过滤结果?

时间:2016-02-01 09:24:32

标签: firebase angularfire

我的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);

1 个答案:

答案 0 :(得分:1)

这应该有效:

var query = myArticlesRef.orderByChild('category').equalTo(‘Music’).limitToFirst(20);

因此,您要求Firebase返回音乐类别中的前20篇文章。

虽然在来自关系/ 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。另请阅读Firebase documentation on data modeling and indexes