Запрос с помощью вложенных указателей?

#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 ).