我正在尝试编写该功能以删除我的应用中的帖子。当我删除帖子时,我想删除与该帖子相关的所有标签。 我使用Firebase,不是很长时间,我真的不知道该怎么做:/
我有每个“hashtags”和孩子,相关的帖子。
当我删除帖子时,我想删除与标签相关联的子项。
这是我未完成的代码:
func deleteHashtagsFromPost(withPost id: String) {
Database.database().reference().child("hashtag").observe(.value) { (snapshot) in
if let dict = snapshot.value as? [String: Any] {
for hashtag in dict {
// Here I can access to the hashtag with hashtag.key
// And also to the children associated with hashtag.value
}
}
}
}
这是我的数据库中“帖子”的见解:
答案 0 :(得分:0)
在Firebase基于的NoSQL数据库中,最佳做法是复制对象。
您的代码最初属于相关的帖子,因此请将它们放在此处。可以很容易地在应用中显示它们,因为它们位于您检索的对象中。您可能还希望根据标签搜索帖子,因此您可以像创建标签一样创建标签分支,这样您就可以获得所有相关帖子,而无需在每个帖子中搜索标签。
这似乎是多余的,但这就是它在noSQL中的工作方式,如果你想要更好的结果,你必须为你的数据处理多个位置。
您可能知道,但如果您的数据模型有很多关系,那么最好去一个SQL数据库。 (你的模型不是很多,所以没关系)
Vive la baguette!
答案 1 :(得分:0)
这里的问题是你的帖子里面没有存储主题标签。因此,为了删除它们,您必须遍历整个hashtag分支,而您不希望在客户端执行该分支。我将主题标签存储在post对象中。然后这样做
let hashtags = [String]() // put all the posts hashtags in here
let postKey = post.key // key for the post you just deleted
for i in 0..<hashtags.count {
deleteHashtagsFromPost(postKey: postKey, hashtagUsedInPost: hashtags[i])
}
func deleteHashtagsFromPost(postKey: String, hashtagUsedInPost: String) {
Database.database().reference.child("hashtag").child(hashtagUsedInPost).child(postKey).removeValue()
// you can add a completion block if you wish
}
如果您对使用Firebase云功能感兴趣,可能会看起来像这样:
'use strict';
const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);
// so we can write to the database in functions outside of the database triggers
var db = admin.database();
exports.deleteHastags = functions.database.ref('/posts/{postid}').onDelete(event => {
console.log("Post was deleted");
const key = event.data.previous.key;
const post = event.data.previous.val();
const hashtags = event.data.previous.val().hashtags; // requires that the hashtags are stored with the post in FB DB
removeHashtags(hashtags, key);
return;
});
function removeHashtags(hashtags, key) {
for (var hashtag in hashtags) {
db.ref("hashtag").child(hashtag).child(key).remove();
}
}