这个问题有两个部分。集合结构为:
_id: MongoID,
agent_id: string,
result: string,
created_on: ISO DATE,
...其他字段...
第一部分:
期望的输出:每个 agent_id 的一个结果和带有计数的结果组合:使用 PostgreSQL 的具有等效 SQL 的 TUPLE 表示。
( "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 在我自己运行它时限制了查询,但只要我添加 $group 我就会得到很多结果。此外,我似乎无法理解如何按多个字段进行分组。如何编辑下面的查询以获得与上面的 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 函数(自定义函数)来执行此操作。Pg 特定的 SQL 是:
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 聚合框架实现这些所需的压缩结果?