使用电子邮件地址作为firestore中的密钥

时间:2018-05-17 14:14:01

标签: google-cloud-firestore

我想根据电子邮件地址创建“邀请函”,以便当有该电子邮件的用户到达系统时,他的邀请已经在等待他了。

所以我想创建一个基于groupId + '_' + invited_user_email的密钥的邀请集合,但如果用户是test@test.com,则.com被解释为子密钥:(

我试过groupId + '_' + invited_user_email.replace(/[.]/g,'\\.'),但也没有帮助。

我错过了什么?有没有办法包括'。'在firestore文档的ID中?

编辑: 每个Doug Stevenson的请求是我现在使用的代码:

     var invitedUserEmailAsKey=invitedUserEmail.replace(/[.]/g,'\\.')
     var batch = db.batch();

     var groupRef = db.collection("groups").doc(groupId);
     var invitationRef = db.collection("invitations").doc( groupRef.id + '_' + invitedUserEmailAsKey);

     var groupUpdates = {};
     groupUpdates['invited.' + invitedUserEmailAsKey + '.user_name'] = invitedUserName;
     groupUpdates['merge'] = true;

     batch.update(groupRef, groupUpdates);

问题在于group集合的更新文档。 最终看起来像这样: enter image description here

而不是将someone@gmail.com作为关键

2 个答案:

答案 0 :(得分:0)

在键中使用带有“点”的update()被解释为嵌套字段documented here

请注意,您正在更新文档字段(groupRef),而不是使用“邀请”集合进行任何操作。我不认为在每个邀请的群组文档上创建一个新字段是你真正想做的事情。

答案 1 :(得分:0)

正如 Dror 提到的,使用 update() 和键中的点添加用户是行不通的。

我将 set 方法与 merge true 一起使用:

addUserToGroup(id,email,type){
    this.log("id",id,"email",email,"type",type);
    let obj = {};
    obj[email] = type;
    this.angularFireStore.collection("Users").doc(id).set(obj, { merge: true }).then(() => {
      this.log("addedUser",email);
    }).catch((error) => {
      this.log("failed to add user",error)
    })
}

来自文档:https://firebase.google.com/docs/firestore/manage-data/add-data#web-v8_1

“要创建或覆盖单个文档,请使用 set() 方法”

“如果您不确定文档是否存在,请传递将新数据与任何现有文档合并的选项,以避免覆盖整个文档。”