我正在使用angular,firebase和cloud函数进行项目。我的数据如下:
我想检索除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);
});
});
云函数/角度中是否有任何方法可以排除某些字段,以便更快地获取数据? 任何帮助表示赞赏。
答案 0 :(得分:1)
从Firebase实时数据库(即从特定节点)获取数据时,您将在包括子集合(如果有)的位置下载整个数据。 See firebase doc for listening values
有两种方法可以避免使用profile_picture
下面让我详细解释
步骤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更有意义,因为您只想读取一次数据。