#parse-platform
#платформа синтаксического анализа
Вопрос:
Я переписываю веб-приложение «Yelp для комнат общежития» в Node / Express с серверной частью синтаксического анализа (версия PHP здесь для контекста).
Поскольку я очень привык к базам данных SQL, я организовал свои данные в четыре таблицы с указателями «один ко многим»:
Rooms
Halls
Clusters
Campuses
У каждой комнаты есть указатель на свой зал, у каждого зала есть указатель на свой кластер (небольшую группу залов), и у каждого кластера есть указатель на свой кампус.
Однако, поскольку каждый зал / кластер / кампус имеет свою собственную культуру, я хочу иметь возможность поиска по каждому уровню (например, я хочу жить в Южном кампусе или Норрис-холле). Однако, поскольку указатели вложены на три уровня глубиной, у меня возникла проблема с поиском по кампусу и возвратом комнат. Мне бы не хотелось дублировать данные и копировать / вставлять данные кластера и кампуса в каждый объект room.
Поиск кластера прост. Я могу просто:
var clusterQuery = new Parse.Query("clusters");
clusterQuery.equalTo("cluster", req.params.cluster);
var hallsQuery = new Parse.Query("halls");
hallsQuery.matchesQuery("cluster", clusterQuery);
query.matchesQuery("hall", hallsQuery);
Итак, я решил, что поиск в кампусе будет просто
var campusQuery = new Parse.Query("campuses");
campusQuery.equalTo("cluster", req.params.campus);
var clusterQuery = new Parse.Query("clusters");
clusterQuery.matchesQuery("campus", campusQuery);
var hallsQuery = new Parse.Query("halls");
hallsQuery.matchesQuery("cluster", clusterQuery);
query.matchesQuery("hall", hallsQuery);
Но, конечно, это было бы слишком просто.
Вместо этого я получаю ошибку 154: в запросе было слишком много вложенных запросов.
Итак, мой вопрос к вам, всемогущее сообщество Stackoverflow: что я должен сделать вместо этого?
Ответ №1:
Имеет смысл называть ваши классы именами в единственном числе, Campus
а не Campuses
. Итак, я буду использовать имена в единственном числе.
Ваша модель представляет собой древовидную структуру, и для нее есть несколько шаблонов. Тот, который вы используете, хранит родительские ссылки, это просто, но требует нескольких запросов для поддеревьев, как вы поняли. Поскольку в Parse используется MongoDB, вы можете проверить варианты использования и шаблоны моделей MongoDB, такие как каталог продуктов и древовидные структуры модели.
Рассмотрим шаблон массива предков, где у вас есть что-то вроде {_id: "Room1", ancestors: [pointerToAHall, pointerToACluster, pointerToACampus], parrent: pointerToAHall}
.
Вы можете найти комнаты, в ancestors
массиве которых находится кампус:
var query = new Parse.Query("Room");
query.equalTo("ancestors", aCampusObject)
Обратите внимание, что equalTo
известно, что ancestors
это массив. Возможно, вы захотите проверить документы Parse на наличие запросов к массиву.
Комментарии:
1. Просто стоит отметить, что вы также сможете использовать
matchesQuery('ancestors', innerQuery)
для фильтрации комнаты, где один изancestors
элементов соответствует вложенному запросу (например, поиск по имени вCampus
).