Как запросить firebase для свойства с определенным значением внутри всех детей
У меня есть эта структура данных, где todos организованы, чтобы следовать path/todos/uid/
{
"metausers" : {
"simplelogin:1" : {
"displayName" : "John Doe",
"provider" : "password",
"provider_id" : "1"
},
"simplelogin:2" : {
"displayName" : "GI Jane",
"provider" : "password",
"provider_id" : "2"
}
},
"todos" : {
"simplelogin:1" : {
"-JUAfv4_-ZUlH7JqM4WZ" : {
"completed" : false,
"done" : false,
"group" : false,
"private" : false,
"subject" : "First"
},
"-JUAfveXP_sqqX32jCJS" : {
"completed" : false,
"done" : false,
"group" : false,
"private" : true,
"subject" : "Second"
},
"-JUAfwXnMo6P53Qz6Fd2" : {
"completed" : false,
"done" : false,
"group" : false,
"private" : false,
"subject" : "Third"
}
},
"simplelogin:2" : {
"-JUAg9rVemiNQykfvvHs" : {
"completed" : false,
"done" : false,
"group" : false,
"private" : false,
"subject" : "Q first"
},
"-JUAgAmgPwZLPr2iH1Ho" : {
"completed" : false,
"done" : false,
"group" : false,
"private" : false,
"subject" : "Q second"
},
"-JUAgBfF8f7V5R5-XgrY" : {
"completed" : false,
"done" : false,
"group" : false,
"private" : true,
"subject" : "Q third"
}
}
}
}
и я хотел бы запросить todos, чтобы получить все записи с помощью private:true
. Возможно ли это использование firebase (angularfire) и как я должен это делать? Или я должен денормализовать немного больше и организовать путь/частный, чтобы избежать ходьбы вниз todos?
Ответы
Ответ 1
В Firebase нет предложений WHERE
. Ознакомьтесь с этой нитью для некоторых полезных советов по поиску по нескольким полям этот поток по запросам стиля базы данных, этот блог по запросам и документы.
Ваш первый подход должен состоять в том, чтобы сегментировать данные, как они будут считаться. Что-то вроде следующего:
/todos/public
/todos/private
/todos/completed
Вы также можете использовать приоритеты, как описано в документах. Затем выберите объекты на основе приоритета.
Если список меньше тысячи, что должно быть, если данные правильно разделены, вы, вероятно, можете просто захватить список todo и фильтровать его на клиенте - отличный вариант для коротких коллекций, подобных этому, в частности при работе с большим связующим lib, например Angular.
Ответ 2
Предполагая, что у вас есть uid, это должно быть простым:
var uid = "simplelogin:1";
var todosRef = new Firebase("https://yourdb.firebaseio.com/todos/" + uid);
var privateTodosRef = todosRef.orderByChild("private").equalTo(true);
var privateTodos;
privateTodosRef.on("value", function(response) {
privateTodos = response.val();
});
Это должно возвращать объект со всеми этими пользовательскими todos, организованными их ключом todo (т.е. "-JUAfv4_-ZUlH7JqM4WZ"
. Если вы хотите использовать Angularfire, вы можете обернуть это в $firebaseArray и назначить его следующим образом:
$scope.privateTodos = $firebaseArray(privateTodosRef);
Здесь ссылка для получения дополнительной информации о сложных запросах, и, как упоминалось в других ответах, есть некоторые хорошие оптимизации, которые можно сделать с приоритетами и реструктуризации.
Счастливое кодирование!
Ответ 3
Все данные в Firebaase могут быть доступны по URL-адресам.
Если вы заходите на свой Firebase dashboar для просмотра своей модели данных (Forge) и нажмите на интересующее вас свойство, вы будете перенаправлены на URL-адрес, по которому вы можете получить доступ к этим конкретным данным, например. https://myapp.firebaseio.com/todos/simplelogin:1/-JUAg9rVemiNQykfvvHs/private. Помня об этом, вы можете получить доступ к этим данным с помощью AngularFire.