Firebase 按子值搜索
Posted
技术标签:
【中文标题】Firebase 按子值搜索【英文标题】:Firebase search by child value 【发布时间】:2017-03-21 03:45:56 【问题描述】:我的 Firebase 数据库具有以下结构:
我想按姓名、姓氏或电子邮件搜索用户,但由于我没有上述级别的用户密钥,我不知道如何实现这一点。我正在进行管理员会话,因此它无法访问用户密钥。
我试过了:
let usersRef = firebase.database().ref('users');
usersRef.orderByValue().on("value", function(snapshot)
console.log(snapshot.val());
snapshot.forEach(function(data)
console.log(data.key);
);
);
但它带来了数据库上的所有用户。有什么想法吗?
【问题讨论】:
【参考方案1】:您可以使用equalTo()
按值查找任何子项。在您的情况下,name
:
ref.child('users').orderByChild('name').equalTo('John Doe').on("value", function(snapshot)
console.log(snapshot.val());
snapshot.forEach(function(data)
console.log(data.key);
);
);
orderByChild()
的目的是定义您要过滤/搜索的字段。 equalTo()
可以获取字符串、int和boolean值。
也可以与自动生成的密钥 (pushKey
) 一起使用。
你可以找到所有的文档here
【讨论】:
这可以作为自动完成系统来完成吗?比如,如果用户输入“John”,你可以根据相关性调用 orderByChild 吗? @Epicality 你可以使用startAt()
来做你提到的事情。 Here 你可以找到所有的文档。但基本上搜索为equalTo()
,但只检查字符串是否以用户输入开头。
如何获取具有两个布尔值字段的节点:第一个字段或第二个字段是true
?
@KonstantinKonopko 检查documentation。您可以将equalTo()
与数字、字符串、布尔值或空值一起使用。因此,只需将我的答案替换为 ...orderByChild('name').equalTo(true)
...
我想通了。由于过时的堆栈溢出材料,我正在阅读一些错误信息。 OrderByChild 根据您的回答工作。【参考方案2】:
避免不愉快的意外的警告:当您使用 orderByChild
和 equalTo
时,不要忘记在您的数据上添加索引 (here's the doc)
如果您不这样做,所有节点都将被下载并过滤客户端,如果您的数据库增长,这可能会变得非常昂贵。
【讨论】:
以上是关于Firebase 按子值搜索的主要内容,如果未能解决你的问题,请参考以下文章