Firebase - 如何仅在用户ID与对象中的键匹配的情况下检索数据?

时间:2017-07-20 14:57:42

标签: javascript firebase nosql

我在Firebase中有以下“数据库”:

projects: {
  "-KpVHI1za0ElBWIJWb2k": {
     "name": "John's project"
     "uId": "Kojh6pkRNJPBzU78yzNXUiFv3aP2"
  },
  "-KpVHI1zadedldedWIJWb2k": {
     "name": "Kojh6pkRNJPBzU78yzNXUiFv3aP2"
     "uId": "Kojh6pkRNJPBzU78yzNXUiFv3aP2
  },
  "-KpVKKjSnCD3obVW-hsw": {
     "name": "Kojh6pkRNJPBzU78yzNXUiFv3aP2"
     "uId": "KPQgqAniekUhavofb79v2Jqjdwh1"
  }
}

是否有办法使用firebase规则检索具有特定“uId”值的所有项目。 例如,我有这些规则,但它们不起作用:

{
  "rules": {
    "projects": {
       ".read": "auth != null && data.child('uId').val() == auth.uid",
       ".write": "auth != null" 
    }
  }
}

我正在进行以下查询

firebase.database().ref('projects')on('value', (project) => {
        onRequestProject(project)
      }, (error) => {
        onRequestError(error)
      })

我查看了Firebase文档,但在那里我找不到解决此问题的方法。 我收到的错误:“错误:PERMISSION_DENIED”。 欢迎任何帮助!

谢谢!

1 个答案:

答案 0 :(得分:3)

问题是您正在尝试读取所有子对象,但是您给出了使用匹配的uid读取子对象的规则。

尝试将db查询更改为:

firebase.database().ref('projects').orderByChild('uId').equalTo(<your_reqd_userId>).on('value', (project) => {
    onRequestProject(project)
  }, (error) => {
    onRequestError(error)
  })

如果上述方法不起作用,我建议您将数据库结构更改为:

"projects": {
    "uid1":{
        Add your child objects here.
    },
    "uid2":{
        Add your child objects here.
    }
}

和安全规则:

{
  "rules": {
    "projects": {
       "$uId": {
           ".read": "auth.uid === $uId",
           ".write": "auth.uid === $uId"
       }
    }
}

您的数据库查询将是:

firebase.database().ref('projects').child(<your_reqd_userId>).on('value', (project) => {
    onRequestProject(project)
  }, (error) => {
    onRequestError(error)
  })