오더ByChild가 Firebase에서 작동하지 않음
하위 키를 기반으로 정렬된 목록을 검색하도록 데이터베이스를 쿼리하려고 합니다.다음과 같이 수행하지만(아래 참조), 아무 일도 일어나지 않습니다. 즉, Firebase 데이터베이스에 저장된 것과 동일한 방식으로 주문된 개체를 반환합니다.무슨 일입니까?
self.getAllProfiles = function () {
var qProfile = $q.defer();
var ref = new Firebase(FBURL);
ref.child("users").orderByChild('last_update').on("value", function (snapshot) {
console.log(snapshot.val()) // HERE IS WHERE IT SHOULD BE ORDERED
qProfile.resolve(snapshot.val());
}, function (errorObject) {
qProfile.reject(errorObject);
});
return qProfile.promise;
};
추가로 내 사용자 노드는 다음과 같습니다.
users
/$username
/last_update
/id
/data
/profile_image
/display_name
다음은 스냅샷입니다.
Tester: Object
github: Object
last_update: 1447732462170
userId: "github:12345"
전화할 때snapshot.val()
JSON 개체를 다시 받는 중입니다.JSON 개체의 키 순서는 Firebase가 아니라 브라우저에 의해 결정됩니다.
기본 제공되는 기능을 사용하여 아이들을 정돈합니다.forEach
스냅샷 방법:
self.getAllProfiles = function () {
var qProfile = $q.defer();
var ref = new Firebase(FBURL);
ref.child("users").orderByChild('last_update').on("value", function (snapshot) {
snapshot.forEach(function(child) {
console.log(child.val()) // NOW THE CHILDREN PRINT IN ORDER
});
qProfile.resolve(snapshot.val());
}, function (errorObject) {
qProfile.reject(errorObject);
});
return qProfile.promise;
};
당신은 떠날 수 있습니다.q.resolve()
현재 위치로 전화:snapshot.forEach()
비동기 호출이 아닙니다.
이 질문은 답변이 된 지 1년이 넘은 것으로 알고 있습니다만, 아직 댓글 부분에 혼선이 있기 때문에 추가하고자 합니다.
그 문제는
원래 문제는 OP가 Firebase 실시간 데이터베이스에서 하위 키를 기반으로 주문 목록을 검색하려고 하지만,.orderByChild('arg')
예상대로 작동하지 않습니다.
하지만 예상대로 작동하지 않은 것은 아닙니다..orderByChild('arg')
,그렇지만.on("value", callback)
.왜냐면.on("value", callback)
다른 이벤트와 조금 다르게 작동합니다..on("child_added", callback)
.
예
아래와 같이 파이어베이스 실시간 데이터베이스가 있다고 가정합니다.
{
myData: {
-KYNMmYHrzLcL-OVGiTU: {
NO: 1,
image: ...
},
-KYNMwNIz4ObdKJ7AGAL: {
NO: 2,
image: ...
},
-KYNNEDkLpuwqQHSEGhw: {
NO: 3,
image: ...
},
}
}
--
사용할 경우.on("value", callback)
콜백()은 1회 호출되고 3개의 개체로 이루어진 개체 배열을 반환합니다.
ref.on("value", function(snapshot) {
console.log(snapshot.val());
// Please see Frank van Puffelen's answer
}
--
사용할 경우.on("child_added", callback)
콜백()은 3번 호출되며, 매번 객체를 반환하고 순서대로 반환됩니다.
ref.once("child_added", function(snapshot) {
console.log(snapshot.val());
// The objects are returned in order, do whatever you like
}
결론
파이어베이스에서 순서가 지정된 데이터만 가져오면 되는 경우(예: UI 초기화),ref.orderByChild('arg').once("child_added", callback)
당신에게 잘 어울립니다, 그것은 간단하고 사용하기 쉽습니다.
그러나 어떤 이유로 사용해야 하는 경우ref.orderByChild('arg').on("value", callback)
그럼 프랭크 반 퍼플렌의 대답을 보세요.
언급
자세한 내용은 Firebase 문서를 참조하십시오.on(eventType, callback, cancelCallbackOrContext, context)
그들의 인수와 그들의 반환 값.
또 다른 유용한 문서:웹의 데이터 목록 작업
를 사용하여 주문하는 경우value
이벤트 수신기:
firebase.database().ref('/invoices').orderByChild('name').on('value', snapshot => {
snapshot.forEach(child => {
console.log(child.key, child.val());
});
}
순서를 거꾸로 하려면 다음을 시도합니다.
function reverseSnapshotOrder (snapshot) {
let reversed = [];
snapshot.forEach(child => {
reversed.unshift(child);
});
return reversed;
}
reverseSnapshotOrder(snapshot).forEach(child => {
console.log(child.key, child.val());
});
다음을 참조하십시오. https://firebase.google.com/docs/database/web/lists-of-data#listen_for_value_events
저는 iOS에서도 같은 문제로 어려움을 겪었습니다.스냅샷을 NSDictionary 개체로 변환하면 순서가 지정되지 않은 목록으로 변환됩니다.필요한 경우 목표-c 버전:
[[self.refChild queryOrderedByChild:@"date_created"]
observeEventType:FIRDataEventTypeValue
withBlock:^(FIRDataSnapshot * _Nonnull snapshot) {
for (FIRDataSnapshot *child in snapshot.children) {
NSDictionary *anObject = child.value;
NSString *aKey = child.key;
}
}];
언급URL : https://stackoverflow.com/questions/33893866/orderbychild-not-working-in-firebase
'sourcecode' 카테고리의 다른 글
sqlite 쿼리에서 딕트를 가져오려면 어떻게 해야 합니까? (0) | 2023.06.08 |
---|---|
Mongodb 정렬 내부 배열 (0) | 2023.06.08 |
jQuery를 사용하여 뷰포트 크기 가져오기 (0) | 2023.06.03 |
iPhone/iPad 장치에서 사용 가능/사용 가능한 총 디스크 공간을 검색하는 방법은 무엇입니까? (0) | 2023.06.03 |
Postgre를 시작하는 방법Mac OS X의 SQL 서버? (0) | 2023.06.03 |