2015-02-15 5 views
1

У меня есть большая коллекция клиентов и огромная коллекция данных клиентов, коллекции разделены, и я не хочу объединять их в одну коллекцию (из-за других уже работающих сервлетов), но теперь мне нужно «Присоединить» данные из обеих коллекций в одном результате.Две коллекции mongodb в одном запросе

Поскольку запрос должен возвращать большое количество результатов, я не хочу запрашивать сервер один раз, а затем снова использовать результат для запроса. Я также обеспокоен трафиком между сервером и БД и памятью, которую набор результатов будет занимать в ОЗУ сервера.

То, как он работает, заключается в том, что я получаю соответствующий список клиентов из коллекции клиентов и отправляю этот список в запрос коллекции «данные клиента», и только затем получаю агрегированные результаты.

Я хочу отключить получение и отправку списка клиентов и обратно на сервер, получить сервер, чтобы спросить себя, разрешить запрос коллекции данных клиента запросить коллекцию клиентов для соответствующего списка клиентов.

Как я могу использовать хранимую процедуру (функции javascript) для выполнения запроса в БД и возвращать из коллекции только соответствующие клиенты. В качестве альтернативы, есть способ написать запрос, который объединяет результат из другой коллекции?

+0

там нет такой опции для запроса несколько сбора в monogb.One вещи использовать 'ReferenceField' или 'ForienKey' – itzMEonTV

ответ

3

«Хорошие новости все», эта работа агрегация запросов только штраф в Монго оболочке, как присоединиться к запросу

db.clientData.aggregate([{ 
    $match: { 
     id: { 
      $in: db.clients.distinct("_id", 
      { 
       "tag": "qa" 
      }) 
     } 
    } 
}, 
    $group: { 
     _id: "$computerId", 
     total_usage: { 
      $sum: "$workingTime" 
     } 
    } 
}]); 
0

Как я могу использовать хранимую процедуру для выполнения запроса в БД и возвращать из коллекции только соответствующие клиенты. В качестве альтернативы

Там нет процедуры в MongoDB

Кроме того, Есть ли способ, чтобы написать запрос, который соединяет в результате другой коллекции?

Обычно вам не нужно присоединяться к MongoDB, и такой вещи нет. Гибкость документа, обрабатываемого уже типичной потребностью объединения. Вы должны думать о своей модели документа и спрашивать, как проектировать соединения из вашей схемы всегда должны быть вашим первым портом захода. В качестве альтернативы вам может понадобиться использовать aggregation или Map-Reduce на стороне сервера, чтобы справиться с этим.

+0

Существует не SQL-подобная хранимая процедура, но есть способ сохранить javascript-функции, которые напоминают процедуры, я уверен, что OP хочет знать об этом. http://docs.mongodb.org/manual/tutorial/store-javascript-function-on-server/ –

+0

@ LaszloTenki вы правы, и, как я сказал в своем ответе, он может использовать Map-Reduce вместо этого на стороне сервера. – styvane

1

Основная идея с моделированием данных MongoDB должна быть записи тяжелых, а не читать тяжелые: хранить данные в формате, что вам нужно для чтения, а не в каком-то формате, который сводит к минимуму/позволяет избежать избыточности (т.е. использовать де-нормированная модель данных).

Я не хочу, чтобы объединить их в одну коллекцию

Это не хороший аргумент

Я также обеспокоен трафика между сервером и БД [ ...]

Если вам нужны данные, вам нужны данные. Как способ, которым он задан, имеет значение здесь?

[...] и память, что результирующий набор будет занимать в ОЗУ сервера.

ли объем данных настолько велик, что вы хотите поток это от сервера к клиенту, таким образом, что передается на куски? Сколько данных мы говорим, и почему клиент читает все это?

Как я могу использовать хранимую процедуру, чтобы сделать запрос в БД и возвращать только соответствующие клиент из коллекции

Там нет хранимых процедур в MongoDB, но вы можете использовать server-side map/reduce to 'join' collections. Как правило, код, который хранится в базе данных и запускается ею, является нарушением разделения архитектуры уровня. Я считаю, это один из самых уродливых взломов всех времен - но это спорно.

Кроме того, менее спорно, имейте в виду, что M/R имеет огромный накладные расходы в MongoDB и не ориентирована в режиме реального времени запросы, сделанные, например, в вызове веб-сервера. Эти вызовы будут занимать сотни миллисекунд.

Есть ли способ написать запрос, который объединяет результат из другой коллекции?

Нет, операции ограничены одной коллекцией. Вы можете выполнить второй запрос и использовать там оператор $in, который похож на подзапрос и достаточно быстро, но, разумеется, требует двух раундов.

+0

Большое спасибо за ваш добрый ответ. Я не хотел объединять их в одну коллекцию из-за других уже работающих сервлетов. Как сейчас работает, я получаю соответствующий список клиентов из коллекции клиентов и отправляю этот список в запрос коллекции данных клиента, и только после этого получаю агрегированные результаты. Да, мне нужны данные, но я хочу отключить получение и отправку списка клиентов и обратно на сервер, заставить сервер задавать себе вопрос, разрешить запрос коллекции данных клиента запрашивать у клиентов сбор для соответствующих список клиентов. –

+0

«Процедуры» Я имел в виду функции javascript –

0

Прежде всего, мнемосин и Майкл9 правы. Но если бы я был в ваших силах, также предполагая, что сбор данных клиента - это один документ на одного клиента, я бы сохранил идентификатор документа документа данных клиента в клиентском документе, чтобы упростить «объединение» (по-прежнему нет объединений в Mongo) ,

Если у вас больше клиентских документов данных для каждого клиента, то массив идентификаторов документов.

Но все это не избавляет вас от того, что вы должны реализовать «присоединиться» к вашему коду приложения, если это приложение Rails, то, вероятно, в вашем контроллере.

Смежные вопросы