user549385
user549385

Reputation: 95

How to load first 50 objects in firebase, stop the loading and then filter results?

My Firebase database is more than 800mb large and with more than 100.000 objects (news articles). What I want to do is to fetch just the first 50 objects (most recent) and then to sort the objects got from the result of the first query according to child parameters.

So, for example, when the page is loaded, I need angularfire / firebase to load just first 50 objects and to stop loading the rest of objects in database. Then, I want to filter out just these 50 objects (articles) based on node category music.

So far, my first query seems to be fine (but if there is better way to ask firebase to load X objects and to stop, I would appreciate). But, the second part, I can’t figure it out because firebase throw an error. The error is:

Query: Can't combine startAt(), endAt(), and limit(). Use limitToFirst() or limitToLast() instead

Here is my sample code:

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

Upvotes: 0

Views: 869

Answers (1)

Frank van Puffelen
Frank van Puffelen

Reputation: 599706

This should work:

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

So you're asking Firebase to return the first 20 articles in the Music category.

While it is common to think of queries like this when coming from a relational/SQL mindset, I recommend that you consider this alternative data structure:

articles_by_category
    music
        article1: { }
        article2: { }
        article3: { }
        ...
    technology
        article4: { }
        ...

So instead of storing the articles in one big list, store them by category. That way to access the articles about music, you only have to do:

var query = ref.child('articles_by_category').child('music').limitToFirst(20);

With this approach the database doesn't have to execute any query and it can scale to a much higher number of users.

This is something you'll see regularly in a NoSQL world: you end up modeling your data for the way your application wants to query it. For a great introduction, see this article on NoSQL data modeling. Also read the Firebase documentation on data modeling and indexes.

Upvotes: 1

Related Questions