如何使用Golang在Firebase中搜索特定值?

时间:2017-02-09 10:57:36

标签: go firebase

我正在使用Golang和Firego连接到Firebase。我正在尝试使用Email: john@gmail.com搜索管理员。以下是我的数据库结构

My Firebase Database Structure

为此,我尝试过:

  dB.Child("CompanyAdmins").Child("Info").OrderBy("Email").EqualTo("john@gmail.com").Value(&result)

但它不会产生预期的结果。我怎么能这样做?

3 个答案:

答案 0 :(得分:3)

虽然@ dev.bmax已正确识别问题,但解决方案更简单。您可以指定要订购的属性的路径:

  dB.Child("CompanyAdmins")
    .OrderBy("Info/Email")
    .EqualTo("john@gmail.com")
    .Value(&result)

更新(2017-02-10):

我刚试过的完整代码:

f := firego.New("https://stackoverflow.firebaseio.com", nil)

var result map[string]interface{}

if err := f.Child("42134844/CompanyAdmins").OrderBy("Info/Email").EqualTo("john@gmail.com").Value(&result); err != nil {
    log.Fatal(err)
}

fmt.Printf("%s\n", result)

打印:

  

地图[-K111111:地图[信息:地图[电子邮件地址:john@gmail.com]]]

我放置数据的确切位置。

更新20170213

这是我定义的索引:

  "CompanyAdmins": {
    ".indexOn": "Info/Email"
  }

如果这对您不起作用,请提供一个我可以测试的类似完整代码段。

答案 1 :(得分:0)

您可以将Info数据直接放入CompanyAdmins结构中吗?这样,您的查询就可以了。

CompanyAdmins
    -id
       -Email: "johndon@gmail.com"
       -Settings:
            - fields

答案 2 :(得分:0)

您的查询存在的问题是,Info不是CompanyAdmins的直接子女。

您可以在插入值时使用电子邮件作为密钥而不是自动生成的密钥。这样,您可以直接访问管理员:

dB.Child("CompanyAdmins").Child("john@gmail.com").Child("Info")

否则,您需要重组数据库。您的订单地址(电子邮件)应该高一级,如Rodrigo Vinicius建议的那样。然后,您的查询将更改为:

dB.Child("CompanyAdmins").OrderBy("Email").EqualTo("john@gmail.com")