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

Passing value as key in Firebase database rule

我有一个家庭成员数据库。

家庭成员数据库。

// 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": {
   "$familyKey": {
      ".write": "auth != null && (root.child('family-member').child( 
      newData.child(familyKey).val() // Problem!
      ).child(auth.uid).exists())
   }
}

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

"root.child('family-member').child($familyKey).val() == family_id_1"

这是一个简单的错字。

我需要在键周围加上引号

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

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

关闭。