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

Mon*_*ana 9 android firebase firebase-realtime-database

我能够使用orderByChild和获取子项中特定值的数据equalTo(很酷,它也适用于嵌套子项)

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();
        }
    }
Run Code Online (Sandbox Code Playgroud)

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

Fra*_*len 16

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

但是你可以测试没有任何价值(主要是:没有财产).例如,使用此数据模型:

{
    child1: {
      "user": {
        "id": 1,
        "name": "puf"
      }
    },
    child2: {
      "user": {
        "id": 2,
        "name": "abe"
      }
    },
    child3: {
      "user": {
        "id": 3
      }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

ref.orderByChild('child/name').equalTo(null)
Run Code Online (Sandbox Code Playgroud)

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

child3

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

更新:我之前知道我已经回答了这个问题,但是之前找不到它.这是欺骗:是否可能查询数据不符合指定的条件?.看起来我在那里有一个错误,因为显然我正在测试上面代码中是否缺少属性.

  • 我知道.因此第一行以粗体显示:无法过滤值不同于"标记值"的节点.对不起,我没有更好的消息. (2认同)
  • @FrankvanPuffelen嗨,坦率地说,有一个问题,当你说`ref.orderByChild('child/name').equalTo(null)`,你的意思是child1的父节点被命名为`child`吗? (2认同)

Mon*_*ana 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"
      }
    }
}
Run Code Online (Sandbox Code Playgroud)

更新设计:

因此除了存储用户的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
      }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

我会输出Child1和Child 3

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

我会得到Child2作为输出

  • 我正在使用 Firestore 并通过以下方式尝试了这种技术:```ref => ref.where(`user.${userID}`, '==', null)``` 在我的查询中,但它不起作用...我实际上必须在我的数据中将一个等于 userID 的属性设置为 null,以便在我的查询中获得结果。搜索继续排除 Firestore 查询中的数据... (2认同)