2016-11-20 8 views
0
나는 안드로이드 응용 프로그램에서 중포 기지에 쿼리를 만드는 중이라서

많이 다운로드 쿼리는 다음과 같다 :중포 기지 쿼리 데이터

검색어 1

reference.orderByChild("started").equalTo(true)..addValueEventListener(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      gameOnList.clear(); 
       for (DataSnapshot gamesSnapshot : dataSnapshot.getChildren()){ 
        Game game = gamesSnapshot.getValue(Game.class); 
        if(game.isStarted()) gameOnList.add(game); 
       } 
     } 

     @Override 
     public void onCancelled(FirebaseError firebaseError) { 

     } 
    }); 

이 쿼리는 5 개 결과를 반환하지만, 소모량은 모든 레코드를 반환하는 것처럼 1.5Mb입니다. 무슨 일이 일어날 수 있습니까?

쿼리 2

Reference.limitToLast (5) .addValueEventListener (new ValueEventListener() {    
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      gameOnList.clear(); 
       for (DataSnapshot gamesSnapshot : dataSnapshot.getChildren()){ 
        Game game = gamesSnapshot.getValue(Game.class); 
        if(game.isStarted()) gameOnList.add(game); 
       } 
     } 

     @Override 
     public void onCancelled(FirebaseError firebaseError) { 

     } 
    }); 

또한 5 개 레코드를 반환하지만,이 경우에 10 킬로바이트 소비 :

나는 데이터의 소비를 발생하지 않는 다음 쿼리와 함께, 또 다른 테스트를 수행했다.

과도한 데이터 소비없이 어떻게 첫 번째 쿼리를 만들 수 있습니까?

상담하는 데이터베이스에는 약 1800 개의 레코드가 있습니다.

Game: 
      -KW_-cgwIPt5E8lzguds: 
           level1: array 
           level2: array 
           level3: array 
           level4: array 
           player1: String 
           player1Pts: int 
           player2: String 
           player2Pts: int 
           player1End: boolean 
           player2End: boolean 
           started: boolean 
           completed: boolean 
      -KW_-cgwIPt5E8lztyd5: 
           level1: array 
           .... 
+0

이러한 각 방법의 데이터 소비를 어떻게 측정합니까? – ishmaelMakitla

+0

Firebase 데이터베이스에서 데이터를 선택하면 모든 게임에 대한 모든 세부 정보가 필요합니까? 또는 그 키/다른 값일까요? https://firebase.google.com/docs/database/web/structure-data#avoid_nesting_data – Nirel

+0

'시작된'자녀에 대한 색인이 있습니까? – vzsg

답변

2

의견을 요약하면 : 당신은 필터링 사업자 equalTo, startAt 또는 endAt를 사용하여 쿼리를 작성하는 경우, 당신은 보안에 인덱스를 추가해야

데이터베이스의 구조는 이것이다 선택된 하위 노드에 대한 규칙.

클라이언트가 없으면 클라이언트는 모든 하위 하위 인 을 다운로드하지만 기준과 일치하는 메시지 만보고하면 "전체 검색"과 동일한 작업을 수행해야합니다.

응용 프로그램 로그에 대한 부적합한 쿼리에 대한 바로 그 이유 때문에 경고가 인쇄됩니다. 또는 REST API를 사용하여 동일한 쿼리를 수행하려고하면 즉시 거부됩니다.