2017-01-15 5 views
0

어떻게 firebase에서 sortOrder에 의해 다음 구조를 정렬합니까?Firebase orderByChild 무시됨

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

그러나, 반환 된 첫 번째 노드가 바나나입니다 : 문서에서

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

그것은처럼 간단 보인다. 내가 사용하는 문자열 값은 중요하지 않습니다. 예를 들어, 다음은 동일한 결과를 반환

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); 
     } 
    ); 
} 
+0

콜백에서 자녀를 어떻게 액세스하고 있습니까? – cartant

+0

질문 할 모든 기능 코드를 추가했습니다. –

답변

0

문제는 스냅 샷의 값의 키를 통해 자녀를 액세스 할 때, 순서가 불확정 것입니다. 또한

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을 반환 할 수 :

당신은 스냅 샷의 forEach 방법을 사용해야합니다.

관련 문제