사용 중포 기지의 쿼리 API를 , 당신이 시도 유혹 될 수 있습니다
// !!! THIS WILL NOT WORK !!!
ref
.orderBy('genre')
.startAt('comedy').endAt('comedy')
.orderBy('lead') // !!! THIS LINE WILL RAISE AN ERROR !!!
.startAt('Jack Nicholson').endAt('Jack Nicholson')
.on('value', function(snapshot) {
console.log(snapshot.val());
});
그러나 Firebase의 @RobDiMarco는 주석에서 다음과 같이 말합니다.
여러 orderBy()
통화에서 오류가 발생합니다
따라서 위의 코드는 작동하지 않습니다 .
나는 효과가있는 세 가지 접근법을 알고 있습니다.
1. 서버에서 대부분을 필터링하고 클라이언트에서 나머지를 수행하십시오.
당신이 할 수있는 일은 orderBy().startAt()./endAt()
서버에서 하나 를 실행 하고 나머지 데이터를 끌어 내고 클라이언트의 JavaScript 코드로 필터링합니다.
ref
.orderBy('genre')
.equalTo('comedy')
.on('child_added', function(snapshot) {
var movie = snapshot.val();
if (movie.lead == 'Jack Nicholson') {
console.log(movie);
}
});
2. 필터링 할 값을 결합한 속성을 추가하십시오.
충분하지 않으면 사용 사례를 허용하도록 데이터 수정 / 확장을 고려해야합니다. 예를 들어, 장르 + 리드를이 필터에 사용하는 단일 속성에 넣을 수 있습니다.
"movie1": {
"genre": "comedy",
"name": "As good as it gets",
"lead": "Jack Nicholson",
"genre_lead": "comedy_Jack Nicholson"
},...
본질적으로 그런 식으로 자신의 다중 열 인덱스를 작성하고 다음을 사용하여 쿼리 할 수 있습니다.
ref
.orderBy('genre_lead')
.equalTo('comedy_Jack Nicholson')
.on('child_added', function(snapshot) {
var movie = snapshot.val();
console.log(movie);
});
David East는 이러한 속성을 생성하는 데 도움이되는 QueryBase라는 라이브러리 를 작성했습니다 .
상대 / 범위 쿼리를 수행 할 수도 있습니다. 카테고리 및 연도별로 영화 쿼리를 허용한다고 가정 해 봅시다. 이 데이터 구조를 사용합니다.
"movie1": {
"genre": "comedy",
"name": "As good as it gets",
"lead": "Jack Nicholson",
"genre_year": "comedy_1997"
},...
그런 다음 90 년대 코미디를 요청하십시오.
ref
.orderBy('genre_year')
.startAt('comedy_1990')
.endAt('comedy_2000')
.on('child_added', function(snapshot) {
var movie = snapshot.val();
console.log(movie);
});
연도 이상을 필터링해야하는 경우 다른 날짜 부분을 내림차순으로 추가하십시오 (예 :) "comedy_1997-12-25"
. 이런 식으로 Firebase가 문자열 값에서 수행하는 사전 순서는 시간 순서와 동일합니다.
이 속성 값 조합은 둘 이상의 값으로 작동 할 수 있지만 복합 속성의 마지막 값에 대해서만 범위 필터를 수행 할 수 있습니다.
매우 특별한 변형은 Firebase 용 GeoFire 라이브러리에 의해 구현됩니다 . 이 라이브러리는 위치의 위도와 경도를 소위 Geohash로 결합한 다음 Firebase에서 실시간 범위 쿼리를 수행하는 데 사용할 수 있습니다.
3. 프로그래밍 방식으로 맞춤 색인 만들기
또 다른 대안은이 새로운 Query API가 추가되기 전에 우리가 한 모든 작업을 수행하는 것입니다. 다른 노드에서 색인을 작성하십시오.
"movies"
// the same structure you have today
"by_genre"
"comedy"
"by_lead"
"Jack Nicholson"
"movie1"
"Jim Carrey"
"movie3"
"Horror"
"by_lead"
"Jack Nicholson"
"movie2"
아마도 더 많은 접근법이있을 것입니다. 예를 들어이 답변은 대체 트리 모양의 사용자 지정 인덱스 ( https://stackoverflow.com/a/34105063)를 강조합니다.
orderBy()
되면 클라이언트가 현재 예상치 못한 결과를 제공하기 때문에 여러 통화에서 오류가 발생합니다. 테스트에서 우연히 작동했을 수도 있지만 일반적 으로이 작업을 수행하도록 빌드되지 않았습니다 (추가하고 싶습니다!).