Move/Copy Firebase 对象到另一个子节点
Move/Copy Firebase Object to Another Child Node
我在 firebase 中有一个用户对象,我需要移动到同一树上的另一个子节点。
结构是这样的:
users -> male -> uid -> ......KVPs..objects...etc
-> female -> uid -> ......KVPs..objects...etc
由于应用的性质,我需要将用户按性别分开。
如果用户更改了他们的性别,我想将他们的所有详细信息移动到所选的性别。
我尝试使用 AngularFire (firebaseObject),但由于对象中存在键,当我尝试在 firebase 中设置它时它会抛出错误。我尝试使用 JSON.stringify、angular.toJSON 剥离键,但我没有任何运气!!
我想知道是否有更简洁或推荐的方法来执行此操作?
感谢如果有人有任何指示或无论如何都可以提供帮助。
非常感谢,
诺尔
这其实很简单
// 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);
});
我实际上建议更改结构而不是移动节点
users
uid_0
name: "some name"
gender: "male"
loc: "US"
uid_1
name: "another name"
gender: "female"
loc: "FR"
它仍然提供性别分离,但更灵活地更改名称、性别、位置或其他任何内容,而无需读取、删除和重写现有数据。
它在查询和向每个用户添加额外数据方面也更加灵活。
我可能不适合这个用例,但从大局来看这是最佳实践。
感谢您的回复。我最初是这样的,我仍然在 UID 下捕获性别,但我想将男性和女性分开。我的应用程序是用于约会的,所以我认为根据首选的性别属性进行搜索会更有效率。我认为最初要搜索的节点减少了约 50%。如果您对此有一些建议,很想听听,因为我不太了解 firebase/JSON.
的性能最佳实践
我将 post 我用于复制和清理的代码可能对某些人有帮助。 'on' 侦听器出现问题,它正在删除两个节点。将其更改为 'once' 解决了它。
// 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);
});
我在 firebase 中有一个用户对象,我需要移动到同一树上的另一个子节点。
结构是这样的:
users -> male -> uid -> ......KVPs..objects...etc
-> female -> uid -> ......KVPs..objects...etc
由于应用的性质,我需要将用户按性别分开。 如果用户更改了他们的性别,我想将他们的所有详细信息移动到所选的性别。
我尝试使用 AngularFire (firebaseObject),但由于对象中存在键,当我尝试在 firebase 中设置它时它会抛出错误。我尝试使用 JSON.stringify、angular.toJSON 剥离键,但我没有任何运气!!
我想知道是否有更简洁或推荐的方法来执行此操作? 感谢如果有人有任何指示或无论如何都可以提供帮助。
非常感谢, 诺尔
这其实很简单
// 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);
});
我实际上建议更改结构而不是移动节点
users
uid_0
name: "some name"
gender: "male"
loc: "US"
uid_1
name: "another name"
gender: "female"
loc: "FR"
它仍然提供性别分离,但更灵活地更改名称、性别、位置或其他任何内容,而无需读取、删除和重写现有数据。
它在查询和向每个用户添加额外数据方面也更加灵活。
我可能不适合这个用例,但从大局来看这是最佳实践。
感谢您的回复。我最初是这样的,我仍然在 UID 下捕获性别,但我想将男性和女性分开。我的应用程序是用于约会的,所以我认为根据首选的性别属性进行搜索会更有效率。我认为最初要搜索的节点减少了约 50%。如果您对此有一些建议,很想听听,因为我不太了解 firebase/JSON.
的性能最佳实践我将 post 我用于复制和清理的代码可能对某些人有帮助。 'on' 侦听器出现问题,它正在删除两个节点。将其更改为 'once' 解决了它。
// 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);
});