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

Android Firebase:根据条件排除数据的查询,android,firebase,firebase-realtime-database,Android,Firebase,Firebase Realtime Database,我可以使用orderByChild和equalTo获取子对象中特定值的数据(很酷,它也适用于嵌套子对象) 在找不到特定值的情况下,是否有一种简单的方法来获取数据,基本上类似于notEqualTo(“somevalue”) 在Firebase查询模型中,您无法筛选不相等值 但是您可以测试是否缺少任何值(本质上是:缺少属性)。例如,对于此数据模型: { child1: { "user": { "id": 1, "name": "puf"

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


在找不到特定值的情况下,是否有一种简单的方法来获取数据,基本上类似于
notEqualTo(“somevalue”)

Firebase查询模型中,您无法筛选不相等值

但是您可以测试是否缺少任何值(本质上是:缺少属性)。例如,对于此数据模型:

{
    child1: {
      "user": {
        "id": 1,
        "name": "puf"
      }
    },
    child2: {
      "user": {
        "id": 2,
        "name": "abe"
      }
    },
    child3: {
      "user": {
        "id": 3
      }
    }
}
我可以通过以下方式查询没有
用户名/名称
属性的子项:

ref.orderByChild('user/name').equalTo(null)
这导致了唯一一个没有名字的孩子:

孩子3

请随意使用我的jsbin,看看您是否可以进一步:


更新:我知道我以前已经回答过这个问题,但之前找不到。这是被骗者:。看起来我犯了一个错误,因为很明显我正在测试上述代码中是否缺少属性。

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

原创设计:

{
    child1: {
      "user": {
        "id": "id1",
        "name": "puf"
      }
    },
    child2: {
      "user": {
        "id": "id2",
        "name": "abe"
      }
    },
    child3: {
      "user": {
        "id": "id1"
        "name": "puf"
      }
    }
}
更新设计:

{
    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和child3获得输出

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

我会得到Child2作为输出


删除了对LikeClean up注释的引用。恐怕我还有更坏的消息……谢谢你,弗兰克!但一般来说,对于user,我想过滤是否有某个用户创建了child*。在这种情况下,id/name永远不会为null,我知道。因此,第一行用粗体表示:无法对值不同于“标记值”的节点进行筛选。对不起,我没有更好的消息。谢谢,弗兰克!谢谢你的及时答复。所以我想唯一的方法是获取客户端上的所有值并在那里进行过滤(尽管操作有点昂贵)。我希望这样的功能可以在较新的版本中实现:)@FrankvanPuffelen嗨frank,我有一个问题,当你提到
ref.orderByChild('child/name').equalTo(null)
,你的意思是child1的父节点被命名为
child
?谢谢。它提供了更多的信息。有趣的方法,在存储数据方面有点贵,但确实有用。它节省了我的时间。我正在使用Firestore,我尝试了这种技术,在我的查询中:
ref=>ref.where(`user.${userID}','==',null)
,但它不起作用。。。实际上,为了在查询中获得结果,我必须在数据中将等于userID的属性设置为null。搜索继续排除Firestore查询中的数据。。。