2015-02-19 3 views
1

Я пытаюсь получить все данные о цвете, принадлежащие определенному пользователю, в данном случае simplelogin: 69.Извлечение денормированных данных с помощью firebase, angularFire

Я начинаю с извлечения ключей цветов от пользователя, например:

/users/simplelogin:69/flowers/ 

var ref = new Firebase("https://URL.firebaseio.com/users/"+uid+"/flowers"); 
var sync = $firebase(ref); 

Теперь им застрял выяснить чистый способ для извлечения всех данных цветов обернув thrue каждый цветок ключ от simplelogin: 69 без петли thrue КАЖДЫЙ ключ в/цветы/(в приведенном ниже примере у меня есть только три цветочных ключа, но в производстве у меня может быть 10k).

Я пробовал FirebaseIndex и firebase-util, но не могу заставить его работать правильно. У кого-нибудь есть какие-то советы или что-то еще? Я читал предыдущие сообщения в стеке, но большинство из них устарело или не подходит для того, что им нужно. Будет действительно appriciate все, что можно решить с помощью AngularFire.

С наилучшими пожеланиями, Элиас

{ 
    "flowers" : { 
    "-JiU57sFAfQwYtIq-LCl" : { 
     "image" : "test", 
     "name" : "test", 
     "type" : "Roses", 
     "uid" : "simplelogin:69" 
    }, 
    "-JiU9-3ajlnFLpyUmBvL" : { 
     "image" : "dasdasd", 
     "name" : "sadasdas", 
     "type" : "Roses", 
     "uid" : "simplelogin:69" 
    }, 
    "-JiUF-mioK3jQCYy6ZiG" : { 
     "image" : "ss", 
     "name" : "ss", 
     "type" : "Lilies", 
     "uid" : "simplelogin:69" 
    } 
    }, 
    "users" : { 
    "simplelogin:69" : { 
     "flowers" : { 
     "-JiU57sFAfQwYtIq-LCl" : true, 
     "-JiU9-3ajlnFLpyUmBvL" : true, 
     "-JiUF-mioK3jQCYy6ZiG" : true 
     } 
    }, 
    "simplelogin:70" : { 

    }, 
    "simplelogin:71" : { 

    } 
    } 
} 
+0

Ваша структура данных выглядит нормально для меня. Чтобы получить информацию о цвете для simplelogin: 69, вы должны сделать один запрос для цветовых ключей пользователей в 'users/simplelogin: 69/flowers', а затем 3 запроса на каждый из узлов цветочных данных под' flowers/{id} '. Это 3 для 3 в этом примере, но будет только 3 для 10K, поскольку вы описываете свой производственный набор данных. Я боролся с этой концепцией в Firebase, так как математика в области компьютерных наук [0, 1, n], и понятие выполнения 4 поисков кажется абсолютно пугающим, но на практике это может быть очень хорошо. Сколько цветов у типичных пользователей? – James

+0

Спасибо за ответ @JamesWing Я считаю, что типичный пользователь будет иметь по 100-200 цветов каждый, знаете ли вы, что вы можете сделать несколько запросов на разные узлы с помощью angularFire и связать их с изменениями в firebase (например, если пользователь реклама другого цветка, это принесет это также). – Elias

ответ

5

Получил его сейчас, спасибо @Kato ответ на поток: Firebase data normalized. How should I fetch a collection based on this structure? (попробовал это, прежде чем создавать эту тему, но не получил его на работу, поэтому сделал som небольшие изменения и теперь он работает).

Проводка решение для тех, кто stubling на одной и той же ситуации:

$scope.flowers = {}; 

var flowerRef = new Firebase('https://URL.firebaseio.com/flowers/'); 
var keyRef = new Firebase('https://URL.firebaseio.com/users/'+checkAuth.auth.uid+'/flowers'); 

keyRef.on('child_added', function(snap) { 
    var flowerId = snap.key(); 
    flowerRef.child(flowerId).on('value', function(snap) { 
     $timeout(function() { 
      if(snap.val() === null) { 
       delete $scope.flowers[flowerId]; 
      } 
      else { 
       $scope.flowers[flowerId] = snap.val(); 
      } 
     }); 
    }); 
}); 

keyRef.on('child_removed', function(snap) { 
    var flowerId = snap.key(); 
    $timeout(function(snap) { 
     delete $scope.flowers[flowerId]; 
    }); 
}); 
+0

Выглядит отлично, Элиас. Вы можете сделать это более элегантным, используя $ extendFactory, что позволит вам подключаться к добавленным/измененным методам и загружать цветы «на лету». Я также [продемонстрировал эту технику здесь] (http://jsfiddle.net/katowulf/vspo65qm/). Обратите внимание, как '$$ added' и' $$ updated' извлекают пользователя на основе идентификатора. – Kato

+0

Спасибо за ответ @Kato :) Я проверю $ extendFactory, ценю ссылку на демострацию. – Elias

0

Это действительно трудная проблема с Firebase. Если вы внесете custom factory object в список цветов пользователя, вы можете динамически запрашивать новые данные о цвете при изменении списка.

Смежные вопросы