我的firebase上保存了一个数组,如下所示:
matches:[ {match:{id:1,data:...}}]
我想在此阵列的firebase上只保存一个项目。例如,我的匹配有id:32。我想在firebase中保存的数组中找到它,然后更改它。
我试图做到这一点。但我认为这是非常难以向firebase发出请求,复制数组,并再次保存整个数组。
const ref = `/users/${currentUser.uid}/matches`;
var list = [];
firebase.database().ref(ref).on('value', function (snap) { list = snap.val(); });
if (list.length > 0) {
const indexToUpdate = list.findIndex(k => k.name == match.name)
if (indexToUpdate >= 0) {
list[indexToUpdate] = match;
return dispatch => {
firebase
.database()
.ref(`/users/${currentUser.uid}/matches`)
.set(list)
.then(() => {
dispatch({ type: MATCH_UPDATE, payload: match });
});
};
}
}
有光吗?
答案 0 :(得分:2)
这行代码:
const indexToUpdate = list.findIndex(k => k.name == match.name)
您的数据结构不理想是一个死的赠品。
考虑将匹配项存储在其名称下,并在其前面添加一个字符串,以防止Kenneth提到的数组强制。所以:
matches
match1
date: "2018-06-14..."
...
match2
date: "2018-06-16..."
...
使用此功能,您可以在不需要查询的情况下查找节点以进行匹配。它还可以防止使用数组,这是Firebase中的反模式,正是因为你提到的原因。
有关详情,请参阅Best Practices: Arrays in Firebase上的经典Firebase博客文章。
答案 1 :(得分:1)
Firebase将数组存储为对象,并在返回到客户端时将其转换回数组,如果按字符数字正确排序
但基本上它应该能够在你想要更新的对象的路径上工作。
firebase
.database()
.ref(`/users/${currentUser.uid}/matches/${indexToUpdate}`)
.set(match)
.then(() => {
dispatch({ type: MATCH_UPDATE, payload: match });
});
答案 2 :(得分:0)
您需要在网址
中引用您尝试按ID设置的项目的ID firebase
.database()
.ref(`/users/${currentUser.uid}/matches/32`)
.set(list)
.then(() => {
dispatch({ type: MATCH_UPDATE, payload: match });
});
另外,如果索引不起作用,请使用snap.key获取所需的ID。