在Firebase数据库规则中将值作为键传递

在Firebase数据库规则中将值作为键传递,firebase,firebase-realtime-database,firebase-security,Firebase,Firebase Realtime Database,Firebase Security,我有一个家庭成员数据库 家庭成员数据库。 // Family 1 has user 1, user 2, user 3. // Family 2 has user 4, user 5. // family_id_x is uniquely generated by firebase. // uid is uniquely generated by firebase on registration. (auth.uid) // database 'family-member' 'family-me

我有一个家庭成员数据库

家庭成员数据库。

// Family 1 has user 1, user 2, user 3.
// Family 2 has user 4, user 5.
// family_id_x is uniquely generated by firebase.
// uid is uniquely generated by firebase on registration. (auth.uid)
// database 'family-member'
'family-member':[
  'family_id_1': 'uid_1',
  'family_id_1': 'uid_2',
  'family_id_1': 'uid_3'
  'family_id_2': 'uid_4'
  'family_id_2': 'uid_5'
]
家具数据库

// A family member can create furniture for the family.
// database 'furniture'
'furniture':[
  'furniture_id_1': {
    'furnitureName': "Mahogany Dining Table",
    'familyKey': 'family_id_1'
  }
]
因此,我创建了一个数据库规则,以查看用户是否能够制作新家具。 我已使用uid_1登录。 然后我尝试了以下方法

// database rule for furniture.
"furniture": {
   ".write": "auth != null && (root.child('family-member').child( 
   newData.child(familyKey).val() // Problem!
   ).child(auth.uid).exists())
}
这是失败的。我怀疑划线部分是原因。所以我硬编码

"furniture": {
   ".write": "auth != null && (root.child('family-member').child( 
   'family_id_1' // HardCode! Now works.
   ).child(auth.uid).exists())
}
它起作用了

请让我知道我应该做什么来解决这个问题

编辑:product=>furniture,杂项语法错误

如果我错了,请纠正我(我可能不完全理解您的问题,但这行得通吗):

这是指定一个变量(通配符),您可能希望对其进行
=
类型的比较,例如您试图获取的路径可能始终存在

"root.child('family-member').child($familyKey).val() == family_id_1"
这是一个简单的打字错误

我需要在钥匙周围加上引号

newData.child(familyKey).val() // Problem!

newData.child('familyKey').val() // Solution!

关闭。

您共享的第一位不是有效的JSON:您不能有同一密钥/家族的多个实例。至少您需要
newData.child('familyKey').val()
,并在
famileyKey
部分加引号。但是如果没有看到您正在使用的实际JSON,就很难做到精确using@FrankvanPuffelen ... 这是引语。问题代码可以很好地使用键周围的引号。我感到惭愧。呸。。。。很高兴听到我们发现了问题。在这种情况下,我投票以打字错误结束这个问题,因为其他处于相同情况的开发人员不太可能找到这个问题。谢谢你的回答!但如果我真的这样做,我将很难把产品(家具)作为一个列表来阅读。这意味着我必须创建另一个节点来获取产品列表,或者使用复杂的查询来获取数据。
newData.child(familyKey).val() // Problem!

newData.child('familyKey').val() // Solution!