前に示したすべてのコメントのように、これはAggregationFrameworkを使用して実現できます。C#はお任せしますが、Mongoシェルを使用した簡単な例を示します。
次のサンプルデータから始めます。
> db.runners.find()
{ "_id" : ObjectId("50b3ec3c9dc68d628bd11869"), "name" : "a", "d" : ISODate("2012-10-29T00:00:00Z"), "time" : 10.3 }
{ "_id" : ObjectId("50b3ec429dc68d628bd1186a"), "name" : "a", "d" : ISODate("2012-10-20T00:00:00Z"), "time" : 12.3 }
{ "_id" : ObjectId("50b3ec549dc68d628bd1186b"), "name" : "b", "d" : ISODate("2012-10-29T00:00:00Z"), "time" : 11.45 }
{ "_id" : ObjectId("50b3ec5a9dc68d628bd1186c"), "name" : "b", "d" : ISODate("2012-10-25T00:00:00Z"), "time" : 11 }
{ "_id" : ObjectId("50b3ec6a9dc68d628bd1186d"), "name" : "c", "d" : ISODate("2012-10-25T00:00:00Z"), "time" : 10.8 }
{ "_id" : ObjectId("50b3f1249dc68d628bd1186e"), "name" : "b", "d" : ISODate("2012-11-13T00:00:00Z"), "time" : 23.2 }
次に、次の集計クエリが返されます。
> db.runners.aggregate({$sort:{name:1,d:-1}},{$group:{_id:"$name",d:{$first:"$d"},time:{$first:"$time"}}})
{
"result" : [
{
"_id" : "c",
"d" : ISODate("2012-10-25T00:00:00Z"),
"time" : 10.8
},
{
"_id" : "b",
"d" : ISODate("2012-11-13T00:00:00Z"),
"time" : 23.2
},
{
"_id" : "a",
"d" : ISODate("2012-10-29T00:00:00Z"),
"time" : 10.3
}
],
"ok" : 1
}
最初に、$sort
オペレーターはrunners
byname
を並べ替え、次にd
降順で並べ替えます。したがって、ランナー名ごとの最初のドキュメントは、各ランナーの最新の実行日である必要があります。次に、$group
オペレーターは、各ランナーについて、最新の実行日とそのレースの実行時間とともに、最初のドキュメントをプルします。