我正在开发一个使用 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);
});
});
云函数/Angular 是否有任何方法可以排除某些字段,以便更快地获取数据? 任何帮助表示赞赏。
最佳答案
从 firebase 实时数据库(即从特定节点)获取数据时,您将在该位置下载整个数据,包括子集合(如果有)。 See firebase doc for listening values
有两种方法可以避免 profile_picture
- 在返回对 https 调用的响应时,您可以删除个人资料图片 key 。
- 否则,如果您在下载合作伙伴树时不想将个人资料图片放在其他树中。
下面我来详细解释一下
第 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/