2014-02-11 4 views
2

В процессе агрегации я получил эти данные:Аналог группы CONCAT в SQL

{ 
    "_id" : "billing/DefaultController/actionIndex", 
    "min_time" : 0.033, 
    "max_time" : 5.25, 
    "exec_time" : 555.490999999997, 
    "qt" : 9059, 
    "count" : 2, 
    "date" : [ 
     ISODate("2014-02-10T00:00:00.000Z"), 
     ISODate("2014-02-11T00:00:00.000Z") 
    ] 
}, 

Как изменить мой запрос:

db.page_speed_reduced.aggregate([ 
    {$group: { 
     _id: "$value.route", 
     min_time: {$min: "$value.min_time"}, 
     max_time: {$max: "$value.max_time"}, 
     exec_time: {$sum: "$value.exec_time"}, 
     qt: {$sum: "$value.qt"}, 
     count: {$sum: NumberInt(1)}, 
     date: {$push: "$_id.date"}, 
    }} 
]); 

для получения "дата $", как сцепляются строка:

2014-02-10, 2014-02-11 

UPDATE:

Я попробовал этот вариант, но MongoDB генерируется сообщение об ошибке:

db.page_speed_reduced.aggregate([ 
    {$group: { 
     _id: "$value.route", 
     min_time: {$min: "$value.min_time"}, 
     max_time: {$max: "$value.max_time"}, 
     exec_time: {$sum: "$value.exec_time"}, 
     qt: {$sum: "$value.qt"}, 
     count: {$sum: NumberInt(1)}, 
     date: {$push: "test sting"}, 
    }}, 
    {$project: { 
     'date': {$concat: ['$date']} 
     //'date': {$concat: '$date'} //some error 
    }} 
]); 

uncaught exception: aggregate failed: { 
"errmsg" : "exception: $concat only supports strings, not Array", 
"code" : 16702, 
"ok" : 0 
} 
'date': {$concat: '$date'} 
+0

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

+0

Или вы хотите «подвести» эти даты? Мы не уверены, поскольку вы также ссылаетесь на поля, не указанные в вашем документе. –

ответ

3

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

В трубопроводе вы можете использовать Date Operators, а также оператор $concat. К сожалению, все операторы Date производят целое число в качестве результата, а для нужной строки даты, которую вы хотите, $ concat будет работать только со строками. Другая проблема заключается в том, что вы не можете ввести целое число в тип строки в агрегации.

Но вы можете использование суб-документов, здесь мы будем просто работать с датой:

db.record.aggregate([ 
    // Unwind the array to work with it 
    {$unwind: "$date"}, 

    // project into our new 'day' document 
    {$project:{ 
     day: { 
      year: {$year: "$date"}, 
      month: {$month: "$date"}, 
      day: {$dayOfMonth: "$date"} 
     } 
    } }, 

    // optionalally sort if date order is important [ oldest -> newest ] 
    {$sort: { "day.year": -1, "day.month": -1, "day.day": -1}}, 

    // Wind back unique values into the array 
    {$group: {_id:"$_id", days: {$addToSet: "$day"} }} 
]) 

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

Принципы остаются теми же, если вы хотите уникальный dates таким образом, как массив в конце, или хотите объединить итоги по этим датам. Поэтому прежде всего имейте в виду части $ unwind и $ project, использующие операторов даты.

--EDIT--

С благодарностью сообщества, как показано на this post есть эта недокументированные поведение $ подстрока, в которых целые числа могут быть отбрасываемой в виде строк.

db.record.aggregate([ 
    // Unwind the array to work with it 
    {$unwind: "$date"}, 

    // project into our new 'day' document 
    {$project:{ 
     day: { 
      year: {$year: "$date"}, 
      month: {$month: "$date"}, 
      day: {$dayOfMonth: "$date"} 
     } 
    } }, 

    // optionalally sort if date order is important [ oldest -> newest ] 
    {$sort: { "day.year": -1, "day.month": -1, "day.day": -1}}, 

    // now we are going to project to a string ** magic @heinob ** 
    {$project: { 
     day: {$concat: [ 
      {$substr: [ "$day.year", 0, 4 ]}, 
      "-", 
      {$substr: [ "$day.month", 0, 2 ]}, 
      "-", 
      {$substr: [ "$day.day", 0, 2 ]} 
     ]} 
    }}, 

    // Wind back unique values into the array 
    {$group: {_id:"$_id", days: {$addToSet: "$day"} }} 
]) 

И теперь days являются струнами. Как я уже отмечал ранее, если заказ имеет для вас важное значение, то наилучшим подходом является проецирование в тип документа, как это было сделано, и сортировка по числовым клавишам.Естественно, что проект $, который преобразует дату, может быть намотан на этап групповой стадии для краткости, что, вероятно, вы хотите сделать, работая со всем документом.

0

Эта ссылка может дать вам подсказку:

http://docs.mongodb.org/manual/reference/operator/aggregation/concat/

год: {$ CONCAT: [$ год] }

+0

Привет, спасибо, но это не сработало (обновляю вопрос с помощью примера кода – Hett

+0

@ Хетт вы вернулись и посмотрели ответы. Я думаю, что ваши потребности удовлетворяются. –