Firebase orderByChild игнорируется

Как отсортировать следующую структуру в Firebase по sortOrder?

categories {
    {
        "b": {
            "name": "Banana",
            "sortOrder": 2
        },
        "a": {
            "name": "Apple",
            "sortOrder": 1
        }
    }
}

Из документации это выглядит так же просто, как:

ref('categories').orderByChild('sortOrder').once('value') ...

Однако первым возвращенным узлом является banana. Не имеет значения, какое строковое значение я использую. Например, следующее возвращает те же результаты:

ref('categories').orderByChild('xxx').once('value') ...

Полнофункциональный:

public list(): Observable<Category[]> {

    let ref = firebase.database().ref('categories').orderByChild('sortOrder');

    return Observable.fromPromise(<Promise<any>>ref.once('value'))
        .flatMap(snapshot => {
            let objects = snapshot.val();
            let categories: Array<Category> = new Array();

            for (let key in objects) {
                let category: Category = objects[key];
                category.code = key;
                categories.push(category);
            }

            return Observable.of(categories);
        }
    );
}

1 ответ

  1. Проблема заключается в том, что при доступе к дочерним элементам через ключи значения моментального снимка порядок не определен.

    Необходимо использовать forEachметод моментального снимка:

    return Observable.fromPromise(<Promise<any>>ref.once('value'))
        .flatMap(snapshot => {
            let categories: Array<Category> = new Array();
            snapshot.forEach(childSnapshot => {
                let category: Category = childSnapshot.val();
                category.code = childSnapshot.key;
                categories.push(category);
            });
            return Observable.of(categories);
        }
    );
    

    Кроме того, вы можете просто использовать mapи вернуть categories.