从Firebase检索所有数据,但不包括某些字段

时间:2018-08-31 06:14:50

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

我正在使用angular,firebase和cloud函数进行项目。我的数据如下:

enter image description here

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

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

2 个答案:

答案 0 :(得分:1)

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

有两种方法可以避免使用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对个人资料图片所做的一样。

希望这会给您一些想法。随时问更多。

答案 1 :(得分:0)

我假设VisualBrush节点是您在图片中显示的节点(partner-L80_3...)的父节点。

在您的函数中,您正在侦听整个-L84i...节点,因此您将通过partner接收的是snapshot节点下的完整JSON树。无法仅接收此JSON树的子集。

如果要避免接收profile_picture字段,一种方法是创建另一个节点,在其中存储此数据,如下所示。然后,当您查询partner节点时,您只会获得所需的信息。

partner

最后,请注意,通过使用+ partner + -L80_3...... + partnerEmail //No more profile_picture node here ...... + uid + -L84i....... + partnerEmail ...... + uid + profile_pictures + -L80_3...... //same id than the "parent" partner node + profile_picture + -L84i....... + profile_picture method,您“正在侦听特定位置的数据更改。您将为初始数据触发回调,并且每当数据更改。”。在Cloud Function中使用on() method更有意义,因为您只想读取一次数据。