Polymer 1.x + Firebase 2.x:如何使用Polymerfire将数据推送或放入Firebase?

时间:2016-11-20 22:02:49

标签: firebase firebase-realtime-database polymer-1.0 firebase-polymer polymerfire

使用Polymerfire,我想在不覆盖数据的情况下向Firebase添加新节点。 (我称之为pushput行为。)

换句话说。我想从这开始:

州A
my-app
 |
 - emails
    |
    + email1@example,com
    + email2@example,com

完成这个。

B国
my-app
 |
 - emails
    |
    + email1@example,com
    + email2@example,com
    + email3@example,com
    + email4@example,com

但是,当我从州A开始并执行此操作时:

<firebase-document
    id="doc"
    app-name="app"
    data="{{data}}">
</firebase-document>
...
this.$.doc.save('/', 'emails');

我结束了这个:

B国
my-app
 |
 - emails
    |
    + email3@example,com
    + email4@example,com

请注意起始数据:email1@example,comemail2@example,com已删除。

Here is the Polymerfire documentation。但它没有提到如何完成这种类型的pushput - 类型方法来将数据插入节点。

我该如何做到这一点?

修改

The answer by @motss suggests

this.$.doc('/emails');

而不是

this.$.doc('/', 'emails');

但这不起作用,因为它添加了一个随机自动键,如下所示:

B国
my-app
 |
 - emails
    |
    - -hvOxpxwjpWHBYGj-Pzqw
       |
       + email3@example,com
       + email4@example,com

注意添加的密钥:-hvOxpxwjpWHBYGj-Pzqw从而破坏了数据结构的索引功能。

2 个答案:

答案 0 :(得分:4)

我将在这里假设电子邮件用作对象的键,而不是数组(因为您不能在Firebase实时数据库中拥有数组)。如果是这种情况,您可能需要以下内容:

<firebase-query
  id="emails"
  app-name="my-app"
  path="/emails"
  data="{{emails}}">
</firebase-query>
<script>
  // ...
  this.$.emails.ref.child('email3@example,com').set({new: 'data'});
  // ...
</script>

如果您不想实际查询电子邮件但只是想插入数据,那么使用JS SDK也很容易:

firebase.database().ref('emails').child('email3@example,com').set({new: 'data'});

对于第三个选项,您可以将<firebase-document>与路径一起使用:

<firebase-document
  app-name="my-app"
  path="/emails/[[emailKey]]"
  data="{{emailData}}">
</firebase-document>
<script>
  // ...
  this.emailKey = 'email3@example,com';
  this.emailData = {new: 'data'};
  // ...
</script>

答案 1 :(得分:1)

据我所知,save方法在两个方面做了不同的事情:

  1. set新数据转移到当前位置。
  2. push新数据转移到当前位置。
  3. 为了push新数据,您必须在key方法中不提交save作为第二个参数:

    // This will push new data into the location /emails.
    this.$.doc('/emails');
    
    // To set new data (replacing) at location /emails.
    this.$.doc('/', 'emails');
    

    希望这有助于IIRC。如果我错了,请纠正我。