我正在使用Firebase存储锻炼应用程序的信息。
我用户添加锻炼名称,然后将其推送到数据库。我可以继续推动这些,但我的问题是它似乎并没有像一个对象一样推动数组。请参阅下面的屏幕截图...
正如您在控制台日志中看到的那样,workouts属性是一个对象而不是我期望的数组。
我用来推动它的代码:
let newWorkout = {
title: 'title',
exercises: [{
name: 'pulldownsnsn',
sets: 4
}]}
let ref = firebase.database().ref("/userProfile/"+this.userId);
ref.child("workouts").push(newWorkout);
答案 0 :(得分:1)
Firebase数据库以不同的格式存储数据列表,以满足现代网络的多用户和离线方面的需求。 -K...
被称为推送ID,是您在数据库引用上调用push()
时的预期行为。
请参阅此blog post on how Firebase handles arrays,此博客文章介绍这些密钥的格式以及Firebase documentation on adding data to lists。
答案 1 :(得分:1)
数组很方便,但由于一个简单的原因,它们是分布式数据库的噩梦:在元素被推入或删除时,索引元素标识不可靠。 Firebase数据库改为使用密钥进行元素识别:
// javascript object
['hello', 'world']
// database object
{ -PKQdFz22Yu: 'hello', -VxzzHd1Umr: 'world' }
使用push()
时会变得棘手,因为它实际上不像普通的推送那样,而是作为键生成后进行对象修改的。
示例用法
firebase.database().ref('/uri/to/list').push(
newElement,
err => console.log(err ? 'error while pushing' : 'successful push')
)
答案 2 :(得分:1)
以下是Firebase文档中的示例:
const admin = require('firebase-admin');
// ...
const washingtonRef = db.collection('cities').doc('DC');
// Atomically add a new region to the "regions" array field.
const unionRes = await washingtonRef.update({
regions: admin.firestore.FieldValue.arrayUnion('greater_virginia')
});
// Atomically remove a region from the "regions" array field.
const removeRes = await washingtonRef.update({
regions: admin.firestore.FieldValue.arrayRemove('east_coast')
});
有关this firebase documentation的更多信息。