我正在从Android应用程序查询Firebase,查询如下:
查询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.5 Mb,就像它返回所有记录一样。可能会发生什么?
我已经做了另一个测试,下面的查询不会发生消耗数据:
查询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 kb。
如果不过度消耗数据,我怎样才能进行第一次查询?
咨询的数据库有大约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 :(得分:2)
总结评论:如果使用过滤运算符equalTo
,startAt
或endAt
构建查询,则应将索引添加到所选子节点的安全规则。
如果没有它们,客户端将被迫执行相当于“完全扫描”的操作 - 下载每个孩子,但仅报告符合条件的那些
。由于这个原因,对应用程序日志的任何不符合查询都会打印一条警告。或者,如果您尝试使用REST API执行相同的查询,它将立即被拒绝。