我的用例是我有一个<iron-form>
带有单个<paper-textarea>
字段的字段,该字段接受我解析为数组的电子邮件地址字符串列表,然后我想:
- 将各个电子邮件地址存储在我的 Firebase 中(用于索引和查找目的),
- 在多个位置(每个数据扇出技术),
- 使用单个写入操作(因为如果列表那么长,我不想进行 100 次 API 调用)和
- 不覆盖任何现有数据。
具体来说,我想从状态A开始,如下:
状态 Amy-app
|
- emails
| |
| - email1@example,com
| |- old: "data"
| - email2@example,com
| |- old: "data"
- users
|
- c0djhbQi6vc4YMB-fDgJ
并达到如下状态B:
状态 Bmy-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"}
不会被覆盖。
背景
在那里,我们使用三个选项在新位置插入了一个节点:
- 使用
firebase-query
- JS SDK
- 使用
firebase-document
现在,我需要为多个节点(使用用户定义的而非自动生成的密钥;即,密钥是特定的电子邮件地址)执行相同类型的插入(不删除或替换旧数据)。我还需要使用数据扇出技术通过单个写入操作更新多个路径。
https://firebase.google.com/docs/database/web/read-and-write#update_specific_fieldsfunction 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
不能是电子邮件地址...
挑战在于我需要在一次调用中同时将多个密钥写入多个位置。