Firebase推送阵列 - Javascript

时间:2017-05-30 13:43:43

标签: javascript firebase firebase-realtime-database

我正在使用Firebase存储锻炼应用程序的信息。

我用户添加锻炼名称,然后将其推送到数据库。我可以继续推动这些,但我的问题是它似乎并没有像一个对象一样推动数组。请参阅下面的屏幕截图...

Console log from firebase object

enter image description here

正如您在控制台日志中看到的那样,workouts属性是一个对象而不是我期望的数组。

我用来推动它的代码:

    let newWorkout = {
      title: 'title',
      exercises: [{
        name: 'pulldownsnsn',
        sets: 4
      }]}

    let ref = firebase.database().ref("/userProfile/"+this.userId);

    ref.child("workouts").push(newWorkout);

3 个答案:

答案 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的更多信息。