如何在Javascript中从查询Firebase获取密钥

如何在Javascript中从查询Firebase获取密钥,javascript,angular,firebase,firebase-realtime-database,Javascript,Angular,Firebase,Firebase Realtime Database,如何获取UID等于的密钥:firebase.auth().currentUser.UID,因为我可以在用户输入新数据时更新此信息 如何更新信息?我使用orderByChild和equal和set,但不起作用 我的代码: updateUserInformation() { var ref = firebase.database().ref('/users/'); ref.on('value', (snapshot) => { snapshot.forEach((child)

如何获取
UID
等于的密钥:
firebase.auth().currentUser.UID
,因为我可以在用户输入新数据时更新此信息

如何更新信息?我使用
orderByChild
和equal和set,但不起作用

我的代码:

updateUserInformation() {
  var ref = firebase.database().ref('/users/');
  ref.on('value', (snapshot) => {
    snapshot.forEach((child) => {
      if (child.val().UID == firebase.auth().currentUser.uid) {
        this.profileData = [{
          name: child.val().name,
          lastname: child.val().lastname,
          phone: child.val().phone,
          direction: child.val().direction,
          followQuantity: child.val().followQuantity,
          points: child.val().points,
          sex: child.val().sex,
        }];
        this.cdRef.detectChanges();
      }
    });
  })
}

假设您的实时数据库中有唯一的
UID
字段,您可以这样做:

updateUserInformation() {
  const uid = firebase.auth().currentUser.uid;
  var ref = firebase.database().ref('/users/').orderByChild('UID').equalTo(uid);
  ref.once('value', (snapshot) => {
    const updates = {};
    snapshot.forEach((child) => {
      const userKey = child.key;
      const userObject = child.val();
      updates[`${userKey}/fieldWhichYouWantToUpdate`] = `Field Value you want it to set to`;
      firebase.database().ref('/users/').update(updates);
    });
  })
}

我还没有对此进行测试,但我认为这应该可行。

下面是Firestore和ES6承诺的一个示例。如果考虑切换到FixSt店,查询将是这样的:

    updateUserData = (user) => {

    return new Promise((resolve, reject) => {
        firebaseService.firestore()
            .collection('users')
            .doc(user.id)
            .update({
                name: user.name,
                lastname: user.lastname,
                ...
                })
            .then(() => {
                resolve();
            })
            .catch(function (error) {
                reject(error);
            });
    });
}

@SiddAjmera的答案是正确的。它还显示了当前数据模型的一个缺点:可能有多个节点具有正确的UID。虽然您的应用程序可能不允许这样做,但您的数据模型允许这样做,并且您不能通过安全规则强制UID的唯一值

每当存储具有自然标识符的项时,考虑使用那些自然ID作为关键字存储这些项。在用户的情况下,这意味着您应该强烈考虑将用户存储在UID中。

users: {
  "BD21...Wv33": {
    "email": "test2@test.com",
    ...
  }
}
这一结构:

  • 可以保证每个用户的UID只能出现一次,因为根据定义,键在父节点中是唯一的
  • 您只需通过用户的UID查找用户,方法如下:

    var ref = firebase.database().ref('/users/').child(uid);
    ref.once('value', (snapshot) => {
      console.log(snapshot.key);
      snapshot.ref.child("fieldWhichYouWantToUpdate"].set("Field Value you want it to set to");
    })
    

对不起,我想更新firebase数据库中的信息,此.profileData错误,我不知道您是否理解我的意思。@JuanmaPerez,请尝试更新的答案。我想这就是你要找的。顺便说一句,如果你用的话会容易得多。