从firebase中检索除某些字段之外的所有数据

2023-12-27

我正在开发一个使用 Angular、Firebase 和云函数的项目。我的数据如下:

我想检索除 profile_picture 字段之外的所有数据。在云函数中:

    exports.getPartner = functions.https.onRequest((req, res) => {
    res.header('Content-Type', 'application/json');
    res.header('Access-Control-Allow-Origin', '*');
    res.header('Access-Control-Allow-Headers', 'Content-Type');


    if (req.method === 'OPTIONS') {
        res.status(204).send('');
    }


    var partner = admin.database().ref().child('partner');
    partner.on("value", function (snapshot) {
        res.status(200).json({ partner: snapshot.val() });
    }, function (errorObject) {
        console.log("The read failed: " + errorObject.code);
    });
});

云函数/角度中是否有任何方法可以排除某些字段,以便数据获取更快? 任何帮助表示赞赏。


从 firebase 实时数据库(即从特定节点)获取数据时,您将在该位置下载整个数据,包括子集合(如果有)。请参阅 firebase 文档了解监听值 https://firebase.google.com/docs/database/web/read-and-write#listen_for_value_events

有两种方法可以避免 profile_picture

  1. 在返回对 https 调用的响应时,您可以消除个人资料图片键。
  2. 否则,如果您在下载合作伙伴树时不需要,请将个人资料图片放在其他树中。

下面我来详细解释一下

第 1 步:从对象中消除头像

var partner = admin.database().ref().child('partner');
partner.on("value", function (snapshot) {
    res.status(200).json({ partner: snapshot.val() }); 
    // don't simply return like this. Instead follow like below
   var partners = [] ; // create a partners array
  snapshot.forEach(function(childSnap){
      var p = childSnap.val();
      p.id = childSnap.key // this will the id of the each child inside the partner tree
      delete p.profilePicture;
      partners.push(p); // 
  });
  res.status(200).json({ partner: partners }); 
}, function (errorObject) {
    console.log("The read failed: " + errorObject.code);
});

如果您确实喜欢下面的操作,则可以从 https 响应中删除个人资料图片键。但请记住一件事,无论如何您都会从树上下载所有数据。

第 2 步:将个人资料图片放入其他树中

为此,您需要更改将数据添加到合作伙伴树的方法。让我解释一下。

例如:在添加合作伙伴数据时,将 profile_picture 放入其他类似的partnerDetails 树中。

var partnerKey = firebase.database().ref('partner').push().key;
var partnerUpdate = {};
partnerUpdate['partner/' + partnerKey] = partner; // parnter Object without profilepicture
partnerUpdate['partnerDetails/' + partnerKey + 'profilePicture'] = profilePicture; 
// the partnerKey must be same for the both the tree because it's the associated key for both of them. 

firebase.database().ref().update(partnerUpdate) // this is called multipath update

因此,执行此操作后,您的合作伙伴树中将不会有个人资料图片。我希望您在客户端中列出合作伙伴树,然后单击列表中的合作伙伴之一,这将显示完整的详细信息。如果您这样做,您可以传递合作伙伴密钥(即关联密钥)并获取合作伙伴个人资料图片来执行此操作,

firebase.database().ref('/partnerDetails/' + partnerId).on('value').then(function(partDetailSnap){
  // here you will get the profile_picture of the partner. 
});

云功能将会非常快。除非需要冷启动。您可以对其他一些字段执行相同的操作,就像我使用步骤 2 或 1 对个人资料图片所做的那样。

希望这能给一些想法。请随时询问更多信息。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从firebase中检索除某些字段之外的所有数据 的相关文章

随机推荐