2012-05-30 4 views
1

Im ищет наиболее эффективный способ выполнения суммирующих запросов против mongodb.Суммирование больших объемов данных на mongodb

В настоящее время мы вставляем документы, содержащие различную информацию, и отметку времени даты, когда документ был создан.

Нам нужно подвести эти данные, чтобы быть просмотрены следующим образом:

Документы на час дня 1-24 Документы по дням месяца 1-28/31 Документы по месяцам года 1-12 Документы по годам

Эти суммированные данные будут доступны часто, поскольку мы боимся, что огромное количество данных, брошенных в монго, будет иметь проблемы с суммированием этих данных.

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

Любые мысли о том, как это сделать? Моя команда разработчиков, как и я, новичок в mongodb, и мы хотим убедиться, что мы не попадаем в ловушку производительности с суммированием больших наборов данных.

+0

Вы, кажется, есть работоспособное решение, и является ли его * * самый эффективный способ, это, безусловно, должны обращаться с «массовым суммирующий» вопрос. Похоже, что единственным реальным потенциалом для неэффективности является то, что вы добавляете документы достаточно быстро, чтобы открытие, изменение и сохранение документа «итоговые» стали значительными. Почему бы не реализовать то, что вы придумали, а затем проверить? –

+0

Это то, с чем мы, вероятно, поедем. Не был уверен, был ли более эффективный способ обработки таких ситуаций. –

+0

Этот параметр сводит к минимуму затраты на доступ к чтению для «Открыть документ. Прочитать документ». (при добавлении «Открыть документ. Прочтите документ. Записать документ» в ваши добавления затрат). Говоря как человек, который не имеет никакого опыта с монгодбом, я сомневаюсь, что эта стоимость высока. Если он * слишком высок, реальный ответ заключается в том, чтобы идти с тем же планом, но найти где-нибудь с более быстрым доступом для его хранения. –

ответ

1

Aggregation Framework отлично подходит для запросов такого типа.
Я привел несколько примеров для вас ниже.

Для начала, давайте заполнить некоторые документы:

db.myDocumentCollection.insert ({ "Дата": новая Дата ('01/01/2012'), "тема": «Мой Заголовок 1 «}); db.myDocumentCollection.insert ({"date": new Дата ('01/02/2012 '), "topic": "My Title 2"}); db.myDocumentCollection.insert ({"date": new Date ('01/02/2012 '), «topic»: «My Title 3»}); db.myDocumentCollection.insert ({"date": new Дата ('01/02/2012 '), "topic": "My Title 4"}); db.myDocumentCollection.insert ({"date": new Date ('01/04/2012 '), "topic": "My Title 5"}); db.myDocumentCollection.insert ({"date": new Дата ('01/05/2012 '), "topic": "My Title 6"}); db.myDocumentCollection.insert ({"date": new Date ('01/07/2013 '), "topic": "My Title 7"}); db.myDocumentCollection.insert ({"date": new Дата ('01/07/2013 '), "topic": "My Title 8"}); db.myDocumentCollection.insert ({"date": new Date ('02/07/2013 '), "topic": "My Title 9"}); db.myDocumentCollection.insert ({"date": new Дата ('02/08/2013 '), "topic": "My Title 10"});

Возврат количество документов, сгруппированных по полной дате

db.myDocumentCollection.group(
{ 
    $keyf : function(doc) { 
     return { "date" : doc.date.getDate()+"/"+doc.date.getMonth()+"/"+doc.date.getFullYear() }; 
    }, 
    initial: {count:0}, 
    reduce: function(obj, prev) { prev.count++; } 
}) 

Выход

[ 
     { 
       "date" : "1/0/2012", 
       "count" : 1 
     }, 
     { 
       "date" : "2/0/2012", 
       "count" : 3 
     }, 
     { 
       "date" : "4/0/2012", 
       "count" : 1 
     }, 
     { 
       "date" : "5/0/2012", 
       "count" : 1 
     }, 
     { 
       "date" : "7/0/2013", 
       "count" : 2 
     }, 
     { 
       "date" : "7/1/2013", 
       "count" : 1 
     }, 
     { 
       "date" : "8/1/2013", 
       "count" : 1 
     } 
] 

Возврат количество документов, сгруппированных по дням месяца за год 2013

Это, возможно, немного более актуально для тех запросов, которые вы хотите сделать.
Здесь мы используем cond, чтобы указать только документы группы после 1 января 2012 г.
Вы можете использовать $gte и $lte, чтобы предлагать диапазоны дат здесь.

db.myDocumentCollection.group(
{ 
    $keyf : function(doc) { 
     return { "date" : doc.date.getDate()+"/"+doc.date.getMonth()}; 
    }, 
    cond: {"date" : {"$gte": new Date('01/01/2013')}}, 
    initial: {count:0}, 
    reduce: function(obj, prev) { prev.count++; } 
}) 

Выход

[ 
     { 
       "date" : "7/0", 
       "count" : 2 
     }, 
     { 
       "date" : "7/1", 
       "count" : 1 
     }, 
     { 
       "date" : "8/1", 
       "count" : 1 
     } 
] 
+0

... Я не понимал, пока не отправил свой ответ, этот вопрос был задан в мае! – Alex