2015-04-08 3 views
2

У меня есть таблица:MongoDB группы по мин

id value date 
1  1  2014-08-10 10:00:00 
1  2  2014-08-10 10:05:00 
1  1  2014-08-10 12:00:00 
1  1  2014-08-11 12:05:00 
1  2  2014-08-11 12:06:00 
2  2  2014-08-10 10:00:00 
2  2  2014-08-11 10:05:00 
2  1  2014-08-11 12:00:00 
2  1  2014-08-20 12:05:00 
2  2  2014-08-20 12:06:00 

и я хочу, чтобы получить общее количество значения для каждого идентификатора в первый день. Я могу сделать это в MySQL с помощью следующей команды:

SELECT test.id, COUNT(CASE WHEN value=1 THEN 1 END) AS 'total_value_1', 
       COUNT(CASE WHEN value=2 THEN 1 END) AS 'total_value_2' 
FROM test,  
(SELECT id, date(min(date)) as firstDay 
FROM test 
GROUP BY id) AS temp 
WHERE test.id = temp.id AND date(test.date) = temp.firstDay 
GROUP BY test.id; 

Результат:

id total_value_1 total_value_2 
1   2   1 
2   0   1 

Как я могу сделать это в MongoDB?

+0

я решил не использовать MongoDB, но я до сих пор удивляюсь в а, nswer. – ahmet

ответ

1

Это возможно через структуру агрегации, где вы используете a collection of operators, чтобы определять документы и обрабатывать их на этапах трубопровода, что даст вам желаемые результаты. Первым этапом трубопровода является оператор $project, в котором вы преобразуете поля значений для упрощения манипуляций на более поздних этапах трубопровода. Эквивалент SQL для этой операции:

SELECT id, date, CASE WHEN value=1 THEN 1 END AS 'value_1', 
       CASE WHEN value=2 THEN 1 END AS 'value_2' 
FROM test 

этапов Следующий трубопроводных использовать $group и $project операторов для расчета минимального числа месяца на поле даты и сумма агрегаты на преобразованных полее значения:

db.test.aggregate([ 
    {   
     "$project": { 
      "id": 1,    
      "date": 1,    
      "value_1": { "$cond": [{ "$eq": [ "$value", 1 ] }, 1, 0] }, 
      "value_2": { "$cond": [{ "$eq": [ "$value", 2 ] }, 1, 0] } 
     } 
    }, 
    { 
     "$group": { 
      "_id": { 
       "id": "$id", 
       "date": "$date" 
      }, 
      "minimumDayofMonth": { 
       "$min": { "$dayOfMonth": "$date"} 
      }, 
      "total1" : { 
       "$sum": "$value_1" 
      }, 
      "total2" : { 
       "$sum": "$value_2" 
      }    
     } 
    }, 
    { 
     "$group": { 
      "_id": { 
       "id": "$_id.id", 
       "day": "$minimumDayofMonth" 
      }, 
      "firstDay": { "$min": "$minimumDayofMonth" },    
      "total_value_1" : { 
       "$sum": "$total1" 
      }, 
      "total_value_2" : { 
       "$sum": "$total2" 
      }    
     } 
    }, 
    { 
     "$group": { 
      "_id": "$_id.id",    
      "result": { "$first": "$$ROOT" }     
     } 
    }, 
    {   
     "$project": { 
      "_id": 0, 
      "id": "$_id", 
      "total_value_1": "$result.total_value_1", 
      "total_value_2": "$result.total_value_2" 
     } 
    }  
]) 

Выход:

/* 0 */ 
{ 
    "result" : [ 
     { 
      "id" : 2, 
      "total_value_1" : 0, 
      "total_value_2" : 1 
     }, 
     { 
      "id" : 1, 
      "total_value_1" : 2, 
      "total_value_2" : 1 
     } 
    ], 
    "ok" : 1 
} 
+2

Спасибо за ваш четкий ответ. Я попробовал запрос, изменив даты. Я думаю, что в «$ min» есть проблема: {«$ dayOfMonth»: «$ date»}. Когда я изменил дату minumum в таблице или преобразовал min в max. Я получаю тот же результат. Кроме того, когда я пишу min dayOfMonth, не вернет ли он минимальный день за все месяцы? Например: «2014-08-10», «2014-10-01». – ahmet

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