【问题标题】:Retrieving all the data from firebase excluding some fields从 Firebase 中检索所有数据,不包括某些字段
【发布时间】:2019-02-06 03:13:01
【问题描述】:

我正在使用 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);
    });
});

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

【问题讨论】:

  • 嗨 Brahmi,我希望 Firebase Realtime 数据库在从 firebase RT DB 获取字段时无法省略字段
  • 我希望你不能像在 sql,mysql 中那样从 table_name 中选择 field1,field2

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


【解决方案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. 
});

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

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

【讨论】:

    【解决方案2】:

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

    在您的函数中,您正在侦听整个 partner 节点,因此您将通过 snapshot 接收到的是 partner 节点下的完整 JSON 树。没有办法只接收这个 JSON 树的一个子集。

    如果您想避免接收 profile_picture 字段,一种方法是创建另一个节点来存储此数据,如下所示。然后,当您查询 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
    

    最后,请注意,通过使用on()method,您正在“侦听特定位置的数据变化。您的回调将在初始数据时触发并在数据变化时再次触发。”。在云函数中使用once()method 更有意义,因为您只想读取一次数据。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-10
      • 1970-01-01
      • 2020-03-24
      • 1970-01-01
      • 1970-01-01
      • 2017-12-11
      • 2022-11-28
      • 2023-03-23
      相关资源
      最近更新 更多