LINUX.ORG.RU

node + mongo, запрос из нескольких коллекций

 , ,


0

2

Пытаюсь тут написать небольшой проектик на Ноде в учебных целях. С документо-ориентированными БД не работал раньше, поэтому быстро застрял.

У меня есть пачка объектов, каждый из которых принадлежит некоторой категории. Объекты я сложил в коллекцию items, категории – соответственно в categories.

Пытаюсь теперь сформировать страничку, которая будет а) выводить список объектов по категориям, и б) иметь форму для добавления нового объекта, где среди прочего есть комбо-бокс для выбора категории.

Запросить отдельно список объектов и категорий я могу, а как соединить это вместе? Т.е. если я делаю 2 разных запроса и partial render, из-за асинхронности Ноды нет гарантии порядка завершения запросов и может получиться, что сначала выведется форма, а потом список. Или я ошибаюсь?

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

Третий вариант – пихать список объектов непосредственно массивом в объект категории, вроде как такой подход пропагандируется в документоориентированых БД, но как-то мне от этого тоже не по себе. Может NoSQL это просто не то, что мне нужно и проще взять мускуль? Но хотелось бы все-таки разобраться

Ответ на: комментарий от Y

express+jade как раз и использую. Но прежде чем выводить, надо сначала из базы получить. В качестве движка БД использую mongodb-native, т.е. без ORM

marvin_yorke ★★★ ()

опишу боле подробно задачу и то, как я ее представляю. Пилю бэкенд приложения для небольшой студенческой кафешки. Зачем – вопрос другой, больше для опыта, чем с какой-то практической целью. Но хозяевам идея вроде понравилась.

Минимальное API описывается следующими запросами (примеры ответов - условные):

GET http://server/api/menu – все меню целиком: название + цена Схема:

{
categories: [
{
_id: 1,
name: '(sandwiches|salads|beer|...)',
items: [
{
_id: 1,
name: 'my tasty sandwich',
price: 100500
},
...
]
},
...
]
}

GET http://server/api/menu/:id – инфа об отдельном айтеме: фото, ингредиенты, whatever

{
_id: 1
name: 'my tasty sandwich',
price: 100500,
ingredients: 'bread, ham, cheese',
photo: 'public/photos/sandwich/1',
info: 'interesting fact about sandwiches'
}

POST http://server/api/orders – отправить заказ

{
name: 'Ivan Ivanov',
phone: '123-456',
date: '4/20/2013',
items: [
{
_id: 1,
count: 2
},
{
_id: 15,
count: 1
}
...
]
}

т.е. с одной стороны меню меняется сравнительно редко, зато часто запрашивается целиком, значит можно хранить детали каждого элемента внутри документа категории. Тогда клиенту мы отдаем весь список, а информацию по отдельному элементу он уже выберет из него сам. Вроде нормально. Но тогда встает вопрос о том, как такие иерархические документы апдейтить? И если в POSTе заказа указывать только айдишники, то для отображения заказа в админке нужно делать запрос по вложенным объектам. Можно добавить туда тоже поле категории, тогда будет чуть проще, хотя не факт.

Вобщем подкиньте какого-нибудь чтива по проектированию схемы данных в NoSQL

marvin_yorke ★★★ ()
Последнее исправление: marvin_yorke (всего исправлений: 1)

Не силен в node.js, попробую ответить с точки зрения асинхронных вычислений. Нельзя ли определить третий обьект, композицию двух вычислений, а потом повесить колбек на него?

vertexua ★★★★☆ ()
Ответ на: комментарий от vertexua

а как это без поллинга сделать? По-моему никак. Только в каждом из коллбэков вводить какой-то флаг, который после запроса будет проверяться, как только оба флага станут активны, вызвать рендер страницы. Но это нифига не асинхронно уже

marvin_yorke ★★★ ()
Ответ на: комментарий от marvin_yorke

Только в каждом из коллбэков вводить какой-то флаг, который после запроса будет проверяться, как только оба флага станут активны, вызвать рендер страницы

Именно так и это асинхронно более чем полностью. Третий обьект регистрируется коллбеком дважды, в оба запроса. Он ждет пока все его зависимости будут удовлетворены. Когда они удовлетворены - вызывает свой коллбек. Так вот это верь все внутри начально коллбека, значит асинхронно

vertexua ★★★★☆ ()
Ответ на: комментарий от marvin_yorke

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

function callback(data1,data2,...){}
vertexua ★★★★☆ ()
Ответ на: комментарий от marvin_yorke

И я так делаю) Тоже только начинаю знакомство. А нельзя передавать в запрос вместо коллбека (написать обёртку для запроса, в ней выбрать всё, что нужно, у меня, для этого, например, есть databse.js, из которого можно получить доступ к mongoCollection и к частонеобходимым методам для работы с БД, там же находится и связанная логика — видимо, сказывается привычка писать хранимые процедуры на PL/SQL) указатель на какую-нибудь переменную (в которую будет записана выборка) и дожидаться завершения работы запроса?

Y ★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.