比较Firebase实时数据库规则的子值(.val)时,比较范围有多广


"peopleWhoLike" : {
".write": "data.parent().parent().child('domain').val() == newData.child('domain').val()"
}

下面是JSON结构。我想确定它是在检查用户写作的域=他写作的用户的域。为了便于理解JSON结构,我在3个位置用粗体做了一个例子**。

IrrBgFY9C1ekMmHUkQRzc5LhbDu1是想要写入的用户。他想点赞并给用户uid写信。作为检查,要比较用户uid和IrrBgFY9C1ekMmHUkQRzc5LhbDu1的域。我问题第一行的规则是这样做的,还是只适用于不同的数据库结构?

"people" : {
“user uid” : {
“**Domain** : "aol.com",
"peopleWhoLike: {
"-M-vZavBdcpX3SzkvgKN" : "**IrrBgFY9C1ekMmHUkQRzc5LhbDu1**", ////this is autokey: uid of the likeR///
}
}
“user uid1///IrrBgFY9C1ekMmHUkQRzc5LhbDu1” : {
“**Domain** : "aol.com",
"peopleWhoLike: {
"-M-htrhrthrdyhrf" : "tydBgFY9C1ekMmHUkQRzc5LhbDu1",
}
}
“user uid2” : {
“Domain : "yahoo.com",
"peopleWhoLike: {
"-M-gdgertghd" : "gertgerdgherdhedebe",
}
}
}

应答后更新

代码定义了喜欢这样的人:

let updateLikes: [String: Any] = ["peopleWhoLike/(keyToPost)" : Auth.auth().currentUser!.uid] 
ref.child("people").child(self.postID).updateChildValues(updateLikes, withCompletionBlock: { (error, reff) –

这个例子有很多问题。我会在下面指出那些跳出来的:

  1. 这些规则

    "peopleWhoLike" : {
    ".write": "data.parent().parent().child('domain').val() == newData.child('domain').val()"
    }
    

    这些现在适用于整个peopleWhoLike,在那里你似乎想将它们应用于下面的每个类似节点,这将是:

    "peopleWhoLike" : {
    "$liker":
    ".write": "data.parent().parent().child('domain').val() == newData.child('domain').val()"
    }
    }
    
  2. 规则检查中的newData.child('domain').val()指的是liker下不存在的domain节点。我的猜测是,你试图从他们的用户档案中查找喜欢的人的数据,这需要data.parent().parent().parent().child(newData.val()).child('domain').val()之类的东西。

  3. 为什么在peopleWhoLike下使用按键?如果每个用户只能点赞另一个用户一次(这是最常见的点赞实现(,则习惯使用点赞者的UID作为其节点的密钥:

    "people": {
    "user uid": {
    "Domain": "aol.com",
    "peopleWhoLike": {
    "IrrBgFY9C1ekMmHUkQRzc5LhbDu1": true
    }
    }
    }
    

    有了这种结构,你就可以自动保证每个用户只能点赞一次,这让查找点赞变得更简单了。

最新更新