我是 firebase 的学习者,但对数据结构感到困惑。
我的数据结构如下
myApp--> news
--> K8ZqRIzrX6L3q-HjO8V --> title : "value title1"
--> body : "value body1"
--> ....
--> K8ZqRJ1tI7onmoVX8G4 --> title : "value title2"
--> body : "value body2"
--> ....
现在我想将更多数据推送到 Firebase。我有如下对象:
[{title: "value title2", body: "value body2", ...},{title: "value title3", body: "value body3", ...}]
我的对象有重复项。当我推送到 Firebase 时,它会添加带有新自动生成键的完整新对象。相反,我希望 firebase 仅更新新值并避免重复。
编辑: 我使用了 myFirebaseRef.push(),示例代码在这里,
objNews.forEach(function(news){
myFirebaseRef.push(news,function(){
$('.result').append('<li><strong>' + news.title + '</strong></li>');
});
});
objNews 拥有新数据以及 Firebase 已有数据。我想要实现的是仅推送来自 ObjNews 的新数据,并避免使用 firebase 已有的数据。但是我的代码将 Object 中的所有数据推送到 firebase ,这会导致重复。
最佳答案
如果我理解正确的话,你有一个包含新闻文章的 JavaScript 数组:
[
{title: "value title2", body: "value body2", ...},
{title: "value title3", body: "value body3", ...}
]
您希望将此数组发送到 Firebase,然后能够更新数组中的值并将更新发送到 Firebase。
这是一种反模式,不要这样做!
诀窍在于了解哪个数组索引映射到 Firebase 中的哪个推送 ID。
var keysByIndex = {};
objNews.forEach(function(news, index){
var newRef = myFirebaseRef.push(news);
keysByIndex[index] = newRef.key();
});
现在您可以检查该对象是否已存储在 Firebase 中,如果是,请更新它:
var keysByIndex = {};
objNews.forEach(function(news, index){
if (keysByIndex[index]) {
var newRef = myFirebaseRef.push(news);
keysByIndex[index] = newRef.key();
}
else {
myFirebaseRef.child(keysByIndex[index]).update(news);
}
});
这种方法存在大量的陷阱。
这是处理这种情况的更好方法。
我强烈建议您采取相反的方法:在 Firebase 中进行所有写入操作,然后监听其中的数据数组。这有时称为单向流(因为所有数据都在单个连续循环中流动)或 command-query segregation principle 。
它的工作原理如下:
your app Firebase
+-+
-------- send write command --> | |
+-+ | |
|s| |s|
|t| |t|
|a| |a|
|t| <-- listen for changes --- |t|
|e| |e|
+-+ | |
+-+
在此场景中,本地应用程序状态(场景中的 objNews
)来自对 Firebase 的监听。所有更改都会写入 Firebase,而不是本地数组。
关于如何使用它的一小段内容。我将只创建/更新 DOM 元素,因为这也是您的代码所做的事情:
myFirebaseRef.on('child_added', function(snapshot) {
// a news article was added, add it to the HTML
var key = snapshot.key();
var news = snapshot.val();
$('.result').append('<li id="'+key+'"><strong>' + news.title + '</strong></li>');
})
myFirebaseRef.on('child_changed', function(snapshot) {
// a news article was changed, update the HTML for it
var key = snapshot.key();
var news = snapshot.val();
$('#'+key).html('<li id="'+key+'"><strong>' + news.title + '</strong></li>');
})
myFirebaseRef.on('child_removed', function(snapshot) {
// a news article was remove, remove the HTML for it
var key = snapshot.key();
var element = document.getElementById(key);
element.parentNode.removeChild(element);
})
我的 jQuery 有点生疏,所以其中可能存在一些语法错误。
关于javascript - 更新 firebase,无需重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34944694/