Этот вопрос состоит из двух частей. Структура коллекции:
_id: MongoID,
agent_id: строка,
результат: строка,
created_on: ISO DATE,
... другие поля ...
Часть первая:
Желаемый результат: Один результат для каждого agent_id и комбинации результатов со счетчиком: представление TUPLE с эквивалентным SQL с использованием PostgreSQL.
( "1234", "Success", 4 ),
( "1234", "Failure", 4 ),
( "4567", "Success", 3 ),
( "7896", "Failure", 2 ),
.....
SELECT agent_id, result, count(*)
FROM table
GROUP BY agent_id, result
HAVING created_on >= now()::date;
Я придумал следующий запрос mongo .... Я думаю, что у меня концептуальная или синтаксическая ошибка. В документах говорится, что нужно использовать $ match в начале конвейера:, но хотя $ match ограничивает запрос, когда я запускаю его сам по себе, как только я добавляю группу $, я получаю много результатов. Также я не могу понять, как группировать более чем по одному полю. Как я могу отредактировать приведенный ниже запрос, чтобы получить результаты, подобные приведенному выше SQL-запросу?
db.collection.aggregate(
{ $match :
{ created_on:
{ $gte: new Date('08-13-2012') //some arbitrary date
}
}, $group:
{ _id:"$agent_id" },
$project:
{_id:0, agent_id:1, result:1}
})
Часть 2) Первый набор результатов был бы адекватным, но не оптимальным. С PostgreSQL я могу получить такой результат, как:
( "1234", { "Success", "Failure" }, { 4, 3 } ),
( "4567", { "Success", "Failure" }, { 3, 0 } ),
( "7896", { "Success", "Failure" }, { 0, 2 } )
Я могу сделать это в Postgresql с типом данных массива и функцией set_to_array (настраиваемая функция). Специфический SQL для Pg:
SELECT agent_id, set_to_array(result), set_to_array( count(*) )
FROM table
GROUP BY agent_id, result
HAVING created_on >= now()::date;
Я считаю, что эквивалентная структура данных в mongodb будет выглядеть так:
[
{ "1234", [ { "success": 4 }, { "failure": 4 } ] },
{ "4567", [ { "success": 3 }, { "failure": 0 } ] },
{ "7896", [ { "success": 0 }, { "failure": 0 } ] }
]
Можно ли достичь этих желаемых сжатых результатов с помощью агрегатной структуры mongodb?