Firebase 推送数组 - Javascript

Posted

技术标签:

【中文标题】Firebase 推送数组 - Javascript【英文标题】:Firebase pushing array - Javascript 【发布时间】:2017-05-30 13:43:42 【问题描述】:

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

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

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

我用来推送的代码:

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

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

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

【问题讨论】:

【参考方案1】:

Firebase 数据库以不同格式存储数据列表,以满足现代网络的多用户和离线方面的需求。 -K... 称为推送 ID,是您在数据库引用上调用 push() 时的预期行为。

请参阅 blog post on how Firebase handles arrays、有关这些键格式的博客文章以及 Firebase documentation on adding data to lists。

【讨论】:

【参考方案2】:

数组很方便,但它们是分布式数据库的噩梦,原因很简单:当元素被推送或删除时,索引元素识别不可靠。 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')
)

【讨论】:

你弄明白了吗?有什么建议吗?我有同样的问题。【参考方案3】:

这是 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的信息。

【讨论】:

您的答案基于 Cloud Firestore,问题是参考 Firebase 实时数据库。所以这段代码在 RTDB 中不起作用。

以上是关于Firebase 推送数组 - Javascript的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Firebase 中推送多种类型的数据?

从 api 推送数组数据会导致无限循环

Firebase 实时数组计数不匹配

好程序员分享JavaScrip数组去重操作实例小结

JavaScrip 数组

JavaScrip ES6数组方法