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