如何在Firebase网络应用中插入新的子数据?

The*_*Kid 3 javascript firebase firebase-realtime-database

我正在构建一个简单的汽车数据库应用.当用户添加新车时,它会创建以下JSON数据,其中包含库的空白字段:

{
    "name": "Cars",
    "gallery": [{
        "img": "http://",
        "title": "BMW"
    }, {
        "img": "http://",
        "title": "Lexus"
    }, {
        "img": "http://",
        "title": "Ferrari"
    }],
    "pageId": "23",
    "storeURL": "/app/cars/gallery"
}
Run Code Online (Sandbox Code Playgroud)

现在我想在应用程序中做的是,如果用户添加新的图库图像,它应该在最后一个图库图片之后添加新的图片.所以在法拉利之后应该插入一个新对象.我似乎无法做到这一点,因为每个教程都会导致死胡同,官方Google文档也指定set()将替换所有数据,因此如果您使用update()它将添加,在这种情况下它不会添加.

此代码删除所有数据:

function add(){
  var data = [
    {
      title: 'Mercedes',
      img: 'http://'
    }
  ]
  var postData = {
    pageGallery: data
  };
  var updates = {};
  updates['/app/cars/'] = postData;
  firebase.database().ref().update(updates);
  console.log('New car added');

}
Run Code Online (Sandbox Code Playgroud)

如果我改变并添加孩子:

firebase.database().ref().child('gallery').update(updates);
Run Code Online (Sandbox Code Playgroud)

它没有做任何事情来做数据.你能帮忙吗?

Fra*_*len 14

有关在Firebase数据库中不使用数组的众多原因,请参阅此博客文章.现在读一下,我会在这儿等...

欢迎回来.现在您已经知道为什么您当前的方法将导致痛苦的时间,让我们来看看您应该如何建模这些数据.这篇博客文章已经告诉过你关于推送ID的信息,它们是Firebase的大规模可扩展,离线就绪的阵列式集合方法.

正如我们关于读取和写入数据列表的文档所述,您可以通过调用将项目添加到列表中push().

所以,如果这创造了一辆车:

function addStore(){
  var rootRef = firebase.database().ref();
  var storesRef = rootRef.child('app/cars');
  var newStoreRef = storesRef.push();
  newStoreRef.set({
    name: "Cars",
    "pageId": "23",
    "storeURL": "/app/cars/gallery"
  });
}
Run Code Online (Sandbox Code Playgroud)

然后将图像添加到该商店的图库:

var newCarRef = newStoreRef.child('gallery').push();
newCarRef.set({
  title: 'Mercedes',
  img: 'http://'
})
Run Code Online (Sandbox Code Playgroud)

这将在画廊的末尾添加一个新的汽车/图像(如果它还不存在则创建画廊).