如何使用Polymerfire将数据插入Firebase(多个节点+多个路径)

时间:2016-11-22 19:02:33

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

我的用例是我有<iron-form>个单<paper-textarea>字段,它接受我解析成数组的电子邮件地址的字符串列表,然后我想:

  1. 将个人电子邮件地址存储在我的Firebase中(用于索引和查找),
  2. 在多个位置(数据扇出技术),
  3. 只需一次写入操作(因为如果列表很长,我不想进行100次API调用)和
  4. 不覆盖任何现有数据。
  5. 具体来说,我想从A国开始,如下:

    州A
    my-app
     |
     - emails
     |  |
     |  - email1@example,com
     |     |- old: "data"
     |  - email2@example,com
     |     |- old: "data"
     - users
        |
        - c0djhbQi6vc4YMB-fDgJ
    

    实现B国如下:

    B国
    my-app
     |
     - emails
     |  |
     |  - email1@example,com
     |     |- old: "data"
     |  - email2@example,com
     |     |- old: "data"
     |  - email3@example,com
     |     |- new: "data"
     |  - email4@example,com
     |     |- new: "data"
     - users
        |
        - c0djhbQi6vc4YMB-fDgJ
           |
           - emails
              |
              - email3@example,com
                 |- new: "data"
              - email4@example,com
                 |- new: "data"
    

    注意:{old: "data"}不会被覆盖。

    背景

    I seek to extend this SO question and answer

    在那里,我们在一个新位置插入了一个节点,其中有三个选项:

    1. 使用firebase-query
    2. JS SDK
    3. 使用firebase-document
    4. 现在,我需要为多个节点执行相同类型的插入(不删除或替换旧数据)(使用用户定义,而不是自动生成密钥;即,密钥是特定的电子邮件地址)。我还需要使用数据扇出技术,通过一次写操作来更新多个路径。

      Similar to what's shown here

      https://firebase.google.com/docs/database/web/read-and-write#update_specific_fields
      function writeNewPost(uid, username, picture, title, body) {
        // A post entry.
        var postData = {
          author: username,
          uid: uid,
          body: body,
          title: title,
          starCount: 0,
          authorPic: picture
        };
      
        // Get a key for a new Post.
        var newPostKey = firebase.database().ref().child('posts').push().key;
        // * * * * * * * * * * * * * * * *  
        // THE ABOVE LINE NEEDS TO CHANGE TO SUPPORT USER-GENERATED KEYS SUCH AS EMAIL ADDRESSES
        // * * * * * * * * * * * * * * * * 
      
        // Write the new post's data simultaneously in the posts list and the user's post list.
        var updates = {};
        updates['/posts/' + newPostKey] = postData;
        updates['/user-posts/' + uid + '/' + newPostKey] = postData;
      
        return firebase.database().ref().update(updates);
      }
      

      另请注意,其中一条评论提及:

        

      以上newPostKey无法成为电子邮件地址......

      挑战在于我需要在一次通话中同时将多个密钥写入多个位置。

1 个答案:

答案 0 :(得分:3)

Firebase实时数据库支持任意复杂的原子深度更新(blog post)。它的工作原理如下:

  1. 您可以使用单个.update()电话
  2. 更新任意深度路径
  3. 更新地图关键方面的完整路径将被替换,因此如果您不想吹走父级,则必须直接寻址子项
  4. 路径相对于您当前的参考
  5. 让我们举个例子:

    var update = {};
    
    update['emails/email3@example,com'] = {new: 'data'};
    update['emails/email4@example,com'] = {new: 'data'};
    update['users/c0djhbQi6vc4YMB-fDgJ/emails/email3@example,com'] = {new: 'data'};
    update['users/c0djhbQi6vc4YMB-fDgJ/emails/email4@example,com'] = {new: 'data'};
    
    firebase.database().ref().update(update);
    

    这将同时更新所有位置。要使其动态化,只需在构造键时使用字符串插值。