この質問には 2 つの部分があります。コレクションの構造は次のとおりです。
_id: MongoID、
agent_id: 文字列、
結果: 文字列、created_on
: ISO DATE、
...その他のフィールド...
パート 1:
望ましい出力: 各 agent_id に対する 1 つの結果、および結果の組み合わせとカウント: 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 } )
配列データ型と set_to_array 関数 (カスタム関数) を使用して Postgresql でこれを行うことができます。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 集約フレームワークでこれらの望ましい圧縮結果を達成することは可能ですか?