我在firebase中有一个用户对象,我需要移动到同一棵树上的另一个子节点。
结构如下:
users -> male -> uid -> ......KVPs..objects...etc
-> female -> uid -> ......KVPs..objects...etc
由于应用的性质,我需要让用户按性别分开。 如果用户更改了其性别,我希望将所有详细信息移至所选的性别。
我尝试使用AngularFire(firebaseObject),但是当我尝试在firebase中设置它时,由于对象中存在键,它会抛出错误。我尝试使用JSON.stringify,angular.toJSON去除键,但是没有运气!!
我想知道有更清洁或推荐的方法吗? 欣赏如果有人有任何指示或无论如何都可以提供帮助。
非常感谢, 诺尔
答案 0 :(得分:4)
这实际上非常简单
// firebase ref
desc.ref1 = new Firebase(desc.userRef+'/'+desc.oldGender+'/'+uid);
desc.ref2 = new Firebase(desc.userRef+'/'+desc.gender+'/'+uid);
desc.ref1.on("value", function(snapshot) {
console.log(snapshot.val());
desc.ref2.set(snapshot.val());
}, function (errorObject) {
console.log("The read failed: " + errorObject.code);
});
答案 1 :(得分:0)
我实际上建议更改结构而不是移动节点
users
uid_0
name: "some name"
gender: "male"
loc: "US"
uid_1
name: "another name"
gender: "female"
loc: "FR"
它仍然提供性别分离,但更灵活地更改名称,性别,位置或其他任何内容,而无需阅读,删除和重写现有数据。
对于查询以及向每个用户添加其他数据,它也更加灵活。
我可能不会为这个用例工作,但从大图来看这是最好的做法。
答案 2 :(得分:0)
感谢您的回复。我原来是这样的,我仍然在UID下捕获性别,但我想分开男性和女性。我的应用程序用于约会,所以我认为根据首选的性别属性进行搜索会更有效率。我认为最初搜索的节点减少了约50%。如果您对此有一些建议,我很乐意听到,因为我对firebase / JSON的性能最佳实践不太了解。
我要发布用于复制和清理的代码,因为这可能对某人有帮助。我在' on'监听器,它正在删除两个节点。将此更改为'一次'解决了它。
// firebase refs
desc.ref1 = new Firebase(desc.userRef+'/'+desc.oldGender+'/'+uid);
desc.ref2 = new Firebase(desc.userRef+'/'+desc.gender+'/'+uid);
// copy user object
desc.ref1.once("value", function(snapshot) {
// copy user data to new gender tree
desc.ref2.set(snapshot.val(), function(error) {
if (error) {
$log.info("could not copy user object." + error);
} else {
$log.info("user object copied successfully.");
// remove user object under old gender
desc.ref1.remove(desc.onComplete);
}
});
}, function (errorObject) {
$log.info("The read failed: " + errorObject.code);
});