Возможна ли подстановочная функция в запросах Firestore? - PullRequest
0 голосов
/ 03 марта 2020

Я пытаюсь решить, как моделировать данные в firestore.

По сути, это приложение, в котором перечислены счастливые часы и другие специальные предложения, которые есть в ресторанах. Каждый ресторан / бар может иметь несколько специальных и счастливых часов в зависимости от дня недели.

Это очень упрощенный пример того, как я надеялся смоделировать данные:

name: "Margaritaville",
geo: {
  latitude: 42,
  longitude: -105
},
offers {
  0: {Type: Happy Hours, Time: 3p-6p, Mon: 1, Tue: 1, Wed: 1, Thu: 1, Fri: 0, Sat: 0, Sun: 0 },
  1: {Type: Happy Hours, Time: 2p-5p, Mon: 0, Tue: 0, Wed: 0, Thu: 0, Fri: 1, Sat: 1, Sun: 0},
  2: {Type: Happy Hours, Time: All Day, Mon: 0, Tue: 0, Wed: 0, Thu: 0, Fri: 0, Sat: 0, Sun: 1},
  3: {Type: Brunch Special, Time: 11a-2p, Mon: 0, Tue: 0, Wed: 0, Thu: 0, Fri: 0, Sat: 0, Sun: 1}
},
etc: "foo",
etc: "bar"

Я ХОЧУ сохранить все данные предложений в виде вложенного объекта внутри каждого бизнес-документа, а не в виде отдельной коллекции, так как для большинства запросов потребуется большая часть этой информации вместе с широтой / длиной, фотографиями, именем и др. c. Но ...

В конечном итоге я хочу иметь возможность создавать фильтры запросов по дням недели (понедельник, вторник и т. Д. 1017 *), предлагать время и типы предложений (Happy Hours, Brunch) и расстояние от пользователь, et c. Однако, как теперь моделируется информация, «предложения», которые создаются внутри каждого документа, упорядочены (0, 1, 2 и c), поэтому, если я хочу выполнить запрос всех ресторанов в пределах 10 миль, которые имеют Например, в понедельник, в день счастливого часа, я надеялся сделать что-то вроде этого:

db.collection("restaurants").where("offers.WILDCARD.days.Mon", "==", 1)

Обратите внимание, на "WILDCARD" выше. Есть ли способ сделать эту работу, или мне нужно перенести предложения в отдельную коллекцию или подборку? Я пытался обернуть голову вокруг ненормализации, я когда-либо работал только с SQL базами данных, поэтому я открыт для совета относительно того, как я должен думать об этом.

1 Ответ

2 голосов
/ 03 марта 2020

Firestore не поддерживает подстановочные знаки в запросах. Кроме того, если ваше поле «предложения» является массивом, вы не сможете запрашивать любое из его вложенных объектов.

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

...