如何使用" push"来防止存储相同的元素方法?

时间:2016-07-28 01:52:28

标签: javascript firebase firebase-realtime-database

我有这个结构

$user: {
    Adressess: {
        $an_uid_generated_by_push_method: {
           street: "3455",
           zipcode: "444555666777"
        }
    }
}

如何阻止我的firebase后端接受Adressess中的另一个相同元素?

2 个答案:

答案 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()。如果您想通过其自然键访问项目(或者在这种情况下:通过自然键强制执行唯一性),通常最好以自然(在您的情况下:复合)键存储项目。