Извлечение всех данных из firebase, исключая некоторые поля - PullRequest
0 голосов
/ 31 августа 2018

Я работаю над проектом с использованием угловых, пожарных и облачных функций. У меня есть следующие данные:

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);
    });
});

Есть ли какой-либо способ в облачной функции / в угловом режиме исключить какое-либо поле, чтобы выборка данных была быстрее? Любая помощь приветствуется.

Ответы [ 2 ]

0 голосов
/ 31 августа 2018

Я предполагаю, что узел partner является родительским узлом узлов, которые вы показываете на своем рисунке (-L80_3..., -L84i...).

В вашей функции вы слушаете весь узел partner, так что вы получите с snapshot полное дерево JSON под узлом partner. Нет способа получить только подмножество этого дерева 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() вы «прослушиваете изменения данных в определенном месте. Ваш обратный вызов будет инициирован для исходных данных и снова всякий раз, когда данные изменения . ". Более разумно использовать метод once() в облачной функции, поскольку вы хотите прочитать данные только один раз.

0 голосов
/ 31 августа 2018

При извлечении данных из базы данных Firebase в реальном времени (т. Е. С определенного узла) вы будете загружать все данные в этом месте, включая дочернюю коллекцию, если она у вас есть. См. Firebase Doc для прослушивания значений

Есть два способа избежать 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.

Надеюсь, это даст некоторую идею. Не стесняйтесь спрашивать больше.

...