我有这个结构
$user: {
Adressess: {
$an_uid_generated_by_push_method: {
street: "3455",
zipcode: "444555666777"
}
}
}
如何阻止我的firebase后端接受Adressess
中的另一个相同元素?
答案 0 :(得分:2)
您需要对数据进行非规范化。顺便提一下,Push会根据时间生成一个独特的标记。您的users
节点应包含uid。在uid下你可以把
street: 123 Blah Lane,
city:New York,
state:New York,
zip:94328
我会使用.set或.update但在此之前你需要查找你想要避免的任何副本。您可以使用查询。
使用Firebase查询:
var users = firebase.database().ref('users');
var street = users.orderByChild('street').equalTo('3455');
street.once('value', function(snapshot) {
console.log('A street with 3455 does '+(snapshot.exists()?'':'not ')+' exist')
});
在规则中定义users
的索引:
{
"rules": {
"users": {
".indexOn": "street"
}
}
}
答案 1 :(得分:1)
这取决于你如何定义一个相同的元素"?如果你在数据中说一个元素是由它的邮政编码和街道标识的(仅仅因为它们是你指定的唯一两个属性),那么通过串联来锁定这些元素的集合是最有意义的。邮政编码和街道价值。
$user: {
Adressess: {
"444555666777_3455": {
street: "3455",
zipcode: "444555666777"
}
}
}
这样您就可以将push()
操作转换为child().set()
操作:
userRef.child('Addresses').child(address.zipcode+'_'+address.street).set(address)
对于您不希望按自然键访问项目的馆藏,请使用push()
。如果您想通过其自然键访问项目(或者在这种情况下:通过自然键强制执行唯一性),通常最好以自然(在您的情况下:复合)键存储项目。