我正在测试Firebase的实时数据库,并且遇到了很大的困难。首先,我想知道查找记录并使用其他信息进行更新的最佳方法是什么。假设我有一个用户,并且在发布请求后想更改其名称。

我试过了:

var userRef = admin.database().ref('users');
var email = req.body.email;
var name = req.body.name;
userRef.equalTo(email).update({name: name});


尝试遵循官方文档,但是没有运气。

我的数据库:

users
   -Lbq98URniAej2TkWBhG
      email: "pepe@san.com"
      name: "Pepe"
-Lbq9GC1A131De-iumI0
      email: "pipa@boca.com"
      name: "Pipa"


另外,请记住,我事先不知道uid,因此我必须调查子数据。

最佳答案

首先,我想知道什么是找到最佳的方法
  记录并使用其他信息进行更新。


我不确定这是否是最好的方法,但是对于您的情况,我会以这种方式设置数据库

users
     -- unique user id - 1
        -- name
        -- email
        -- posts
           -- unique post id
     -- unique user id - 2
        -- name
        -- email
        -- posts
           -- unique post id
// and so on


然后,我将使用用户ID更改名称,如下所示。

var database = admin.database();
var name = req.body.name;
var uid = req.body.uid;
var userRef = database.ref('users/' + uid);

userRef.update({name : name})
    .then(() => {
        console.log("Update Successfull")
    })
    .catch(error => {
        console.log(error);
    });


我猜您的数据库是以这种方式组织的:

users
     -- pxTYaszxcsauniqueId1
        -- email
        -- name
        -- posts
           -- unique post id
     -- abcdeFFFaKauniqueId2
        -- email
        -- name
        -- posts
           -- unique post id
// and so on


在这种情况下,我将使用电子邮件来查找文档,如下所示:

// Get a reference to the database service
var database = admin.database();
var name = req.body.name;
var email = req.body.email;

var ref = database.ref("users").orderByChild("email").equalTo(email);

ref.once("value").then(function(snapshot) {
    snapshot.forEach(function(childSnapshot) {

      childSnapshot.ref.update({
        "name" : name
      }).then(function() {
        console.log("Success")
      });

      // Cancel enumeration
      return true;
  });
})


同样,这是假设您已组织数据库的方式。如果您以其他方式组织数据库,则上述代码将无法正常工作。如果不同,请在您发布的问题中添加您组织数据库的方式。

09-13 00:40
查看更多