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查询中的数据。。。