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】:

避免不愉快的意外的警告:当您使用 orderByChildequalTo 时,不要忘记在您的数据上添加索引 (here's the doc)

如果您不这样做,所有节点都将被下载并过滤客户端,如果您的数据库增长,这可能会变得非常昂贵。

【讨论】:

以上是关于Firebase 按子值搜索的主要内容,如果未能解决你的问题,请参考以下文章

Firebase 和 Swift 如何按子值提取特定记录?

如何使用两个子值在 Firebase 中进行搜索?

如何获取内部子值 Firebase?

如何读取 Firebase 子值?

带有子值的 Firebase 多路径原子更新?

如何从 firebase 实时数据库中获取子值?