angular - 从 firebase 中检索所有数据,不包括某些字段

标签 angular firebase firebase-realtime-database google-cloud-functions

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

data image

我想检索除 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);
    });
});

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

最佳答案

从 firebase 实时数据库(即从特定节点)获取数据时,您将在该位置下载整个数据,包括子集合(如果有)。 See firebase doc for listening values

有两种方法可以避免 profile_picture

  1. 在返回对 https 调用的响应时,您可以删除个人资料图片 key 。
  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 响应中删除个人资料图片 key 。但请记住一件事,无论如何您将从树中下载所有数据。

第 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

所以这样做之后,您的个人资料照片将不会出现在合作伙伴树中。我希望您在客户端中列出合作伙伴树,然后单击列表中的合作伙伴之一,这将显示全部详细信息。如果这样做,您可以传递合作伙伴 key (即关联 key )并获取合作伙伴个人资料图片,

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

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

希望这能提供一些想法。随时询问更多。

关于angular - 从 firebase 中检索所有数据,不包括某些字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52109485/

相关文章:

angular - Action /效果 UI 通知后的 ngrx/store

javascript - Angular 8 - 如何将数据从 1 个组件导出到 2,然后再导出到 3

javascript - 本地修改数据的 Firebase 同步 : handling errors & global status

ios - 按下按钮时如何添加谷歌地图标记?

ios - 快速显示所有 firebase 用户的帖子

ios - 在 Firebase DataSnapshot 数组中查找自定义对象的索引

firebase - 如何使用 flutter 从 firebase 数据库中获取基于 userid 的值

angular - 为什么要为 Angualr2 安装 nodejs 和 npm 以使用 Grails 3.0

android - 使用 Firebase 测试实验室为 Android 库执行检测测试?

javascript - 在 Angular2 中使用 [attr.attributeName] 和 [attributeName] 绑定(bind)属性的区别