Firebase:查询根据条件排除数据

时间:2016-08-28 19:51:33

标签: android firebase firebase-realtime-database

我可以使用orderByChildequalTo获取孩子中特定值的数据(很酷,它也适用于嵌套孩子)

private void getData() {
        try {
            final DatabaseReference database = FirebaseDatabase.getInstance().getReference();

            database.child(Constants.TABLE_TASKS).orderByChild("user/id")
                    .equalTo("somevalue")
                    .addValueEventListener(new ValueEventListener() {
                        @Override
                        public void onDataChange(DataSnapshot dataSnapshot) {
                            Timber.d(dataSnapshot.toString());
                        }

                        @Override
                        public void onCancelled(DatabaseError databaseError) {
                        }
                    });
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

是否有一种简单的方法可以获取未找到特定值的数据,基本上类似于notEqualTo("somevalue")

2 个答案:

答案 0 :(得分:16)

Firebase查询模型中,您无法将不等式过滤为值

但是你可以测试是否缺少任何值(基本上是:没有属性)。例如,使用此数据模型:

{
    child1: {
      "user": {
        "id": 1,
        "name": "puf"
      }
    },
    child2: {
      "user": {
        "id": 2,
        "name": "abe"
      }
    },
    child3: {
      "user": {
        "id": 3
      }
    }
}

我可以查询没有user/name属性的孩子:

ref.orderByChild('child/name').equalTo(null)

这导致唯一没有名字的孩子:

  

child3

随意玩我的jsbin,看看你是否进一步:http://jsbin.com/liyibo/edit?js,console

更新:我知道我之前已经回答了这个问题,但是之前找不到它。这是骗局:is it possible query data that are not equal to the specified condition?。看起来我在那里有一个错误,因为很明显我正在测试上面代码中没有属性。

答案 1 :(得分:12)

我认为我找到了解决方案,这更多的是数据库应该如何设计,实际上现在我理解Firebase指南背后的意图

https://firebase.google.com/docs/database/android/structure-data

原创设计:

{
    child1: {
      "user": {
        "id": "id1",
        "name": "puf"
      }
    },
    child2: {
      "user": {
        "id": "id2",
        "name": "abe"
      }
    },
    child3: {
      "user": {
        "id": "id1"
        "name": "puf"
      }
    }
}

更新设计:

除了存储用户的id和名称之外,我们还应该存储一个id本身作为键的节点并将其标记为true

{
    child1: {
      "user": {
        "id": "id1",
        "name": "puf"
        "id1": true
      }
    },
    child2: {
      "user": {
        "id": "id2",
        "name": "abe"
        "id2": true
      }
    },
    child3: {
      "user": {
        "id": "id1"
        "name": "puf"
        "id1": true
      }
    }
}

使用更新的设计,如果我执行ref.orderByChild('user/id1').equalTo(true)

  

我会得到输出为Child1和Child 3

如果我执行ref.orderByChild('user/id1').equalTo(null)

  

我会将Child2作为输出