31

I have below code in an Angular application which is using AngularFire2.

TypeScript:

constructor(db: AngularFirestore) {
    this.booksCollectionRef = db.collection<Book>('books');

    this.books = this.booksCollectionRef.snapshotChanges().map(actions => {
        return actions.map(action => {
            const data = action.payload.doc.data() as Book;
            const id = action.payload.doc.id;
            return { id, ...data };
        });
    });
}

HTML:

<md-list>
    <md-list-item *ngFor="let book of books | async">
        <h4 md-line>{{book.name}}</h4>
    </md-list-item>
</md-list>

This code retrieves and binds data as expected (removes items when collection updated), now I want to sort the collection by a given column. I tried to use firebase orderBy clause, but I can not figure out how to use it with snapShotChanges() method.

6
  • 2
    Have you tried: this.books = this.booksCollectionRef.orderBy('name','desc').snapshotChanges().map(actions => Commented Oct 8, 2017 at 12:38
  • 2
    @GalBracha that also does not work. Property 'orderBy' does not exist on type 'AngularFirestoreCollection<Book>' Commented Oct 8, 2017 at 15:37
  • Have you tried the default sort() function of TypeScript ? If not then please provide us with the structure of your this.books. Commented Oct 10, 2017 at 16:52
  • @GhassenLouhaichi, Not yet. That would be my last option.But I'm trying to get this done within 'snapshotChanges()' because I may need to use some other functions in firestore collection, similarly. Commented Oct 10, 2017 at 16:59
  • I am not following, if you are using .map after your snapshotChanges() call, can't you simply follow that by a .sort call to sort your results ? Commented Oct 10, 2017 at 17:01

3 Answers 3

64
+50

The following should work for your use case:

this.booksCollectionRef = db.collection<Book>('books', ref => ref.orderBy('order field'));

Take a look at the documentation of AngularFirestore for further information on this topic.

Sign up to request clarification or add additional context in comments.

6 Comments

But I can not find a way to use ref.orderBy method with snapShotChanges method, Can you please show me a sample code...
It should be working if you just replace the first line in your constructor with the one I posted. Check out the example app at the bottom of the page I linked, they use this approach in combination with valueChanges()
Did you change orderBy(‘order field‘) to the correct field of your books you want to order by?
I'm so sorry... I tried this again and it works.. Previous day I've missed something... Thanks a lot :)
Glad to help! ;)
|
11
this.announcementCollectionRef = afs.collection<Announcement>('announcements', ref => ref.orderBy('createdAt', 'desc'));
this.announcements = this.announcementCollectionRef.snapshotChanges().map(actions => {
    return actions.map(a => {
        const data = a.payload.doc.data() as AnnouncementId;
        const id = a.payload.doc.id;
        return { id, ...data };
    });
});

2 Comments

life saver. This code worked for me w/ ionic, angular2fire, and firestore.
How is this supposed to work when you don't subscribe to the DocumentChangeAction observer?
0

Not sure about Angular Fire, but you can try using the Firebase Firestore libraries directly.

The following code works for me:

someCollectionRef
.orderBy('columnName')
.onSnapshot((snapshot) => {
snapshot.docChanges.forEach(function (change) {
...doStuff

1 Comment

Do you know why it says to me "Property 'forEach' does not exist on type '(options?: SnapshotListenOptions) => DocumentChange[]'." please?

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.