Запрос базы данных Firebase для получения отфильтрованного списка [duplicate]

Для существующих совпадений используйте query:

df.query(' A > 3' ).head(1)
Out[33]: 
   A  B  C
2  4  6  3

df.query(' A > 4 and B > 3' ).head(1)
Out[34]: 
   A  B  C
4  5  4  5

df.query(' A > 3 and (B > 3 or C > 2)' ).head(1)
Out[35]: 
   A  B  C
2  4  6  3
6
задан user3240644 29 December 2016 в 15:55
поделиться

2 ответа

Объединение двух дат не делает многого с точки зрения облегчения запроса базы данных.

Если вы ищете динозавров в отпуск на определенную дату, они могли бы отправиться в отпуск в любое время до эта дата. (Если не существует политики, которая предусматривает максимальное количество дней в отпуске.) Таким образом, конечная дата, вероятно, вы хотите запросить:

{
  "lambeosaurus": {
    "vacationStart" : "2016-12-20",
    "vacationEnd" : "2016-12-25",
    "length" : 12.5,
    "weight": 5000
  },
  "stegosaurus": {
    "vacationStart" : "2016-12-10",
    "vacationEnd" : "2016-12-20",
    "length" : 9,
    "weight" : 2500
  }
}

Любые динозавры с vacationEnd вкл. Или после 2016-12-20 будет в отпуске в эту дату, если vacationStart включен или раньше 2016-12-20:

function getHolidayingDinosaurs(day) {
  return firebase.database()
    .ref("dinousaurs")
    .orderByChild("vacationEnd")
    .startAt(day)
    .once("value")
    .then((snapshot) => {
      let holidaying = [];
      snapshot.forEach((child) => {
        let val = child.val();
        if (val.vacationStart <= day) {
          holidaying.push(val);
        }
      });
      return holidaying;
    });
}

getHolidayingDinosaurs("2016-12-20").then((holidaying) => console.log(holidaying));

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

В любом случае, запрос с использованием vacationEnd скорее всего, будет выполнять большую часть фильтрации на сервере - если у вас не будет много динозавров, которые планируют свои отпуска заблаговременно.

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

"holidays": {
  ...
  "2016-12-19": {
    "stegosaurus": true
  },
  "2016-12-20": {
    "lambeosaurus": true,
    "stegosaurus": true
  },
  "2016-12-21": {
    "lambeosaurus": true
  },
  ...
}

Многоуровневая система Firebase (в этом случае [more]] [answer] :

firebase.database().ref().update.({
  "dinosaurs/lambeosaurus": {
    "vacationStart" : "2016-12-20",
    "vacationEnd" : "2016-12-25",
    "length" : 12.5,
    "weight": 5000
  },
  "holidays/2016-12-20/lambeosaurus": true,
  "holidays/2016-12-21/lambeosaurus": true,
  "holidays/2016-12-22/lambeosaurus": true,
  "holidays/2016-12-23/lambeosaurus": true,
  "holidays/2016-12-24/lambeosaurus": true,
  "holidays/2016-12-25/lambeosaurus": true
});

. Запрос на holidays/2016-12-20 был бы затем верните объект с ключами для каждого отдыхающего динозавра.

7
ответ дан Community 20 August 2018 в 10:08
поделиться
  • 1
    С update () можно ли получить firebase для создания уникального идентификатора типа push ()? например, данные должны действительно выглядеть так {"lambeosaurus": {firebaseUniqueId: {"vacationStart & quot; : "2016-12-20", "vacationEnd" : "2016-12-25",}, firebaseUniqueId-2: {"vacationStart" : "2017-01-21", "vacationEnd" : "2017-01-25",},}, "стегозавр": {firebaseUniqueId-3: {"vacationStart" : "2016-12-10", "vacationEnd" : "2016-12-20",}}} – user3240644 5 January 2017 в 05:59
  • 2
    Нет, но идентификаторы создаются на клиенте, и их легко сгенерировать. Это создаст ключ, который вы можете использовать в пути в вызове update: let key = firebase.database().ref().push().key (обратите внимание, что это не коснется базы данных, все это происходит на клиенте). – cartant 5 January 2017 в 06:02
  • 3
    Круто! Благодаря!!! – user3240644 5 January 2017 в 06:11

Я рекомендую хранить данные по-другому. Используйте один атрибут для «vacationStart» и один для «vacationEnd». All all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all будет использовать запрос:

var query = firebase.database().ref('dinousaurs').orderByChild('vacationStart').equalTo('2016-12-20');
0
ответ дан Rosário Pereira Fernandes 20 August 2018 в 10:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: