Подтвердить что ты не робот

Как запросить 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?

4b9b3361

Ответ 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.