0

現在、MS SQL Serverリポジトリの代わりに挿入できるMongoDBリポジトリを追加することで、アプリケーションにMongoDBサポートを追加しています。ほとんどのクエリが単純で、データベース構造が適切に移行される限り、すべてが順調に進んでいます(かなり単純です)。

現在戦っている要約レポートがいくつかありますが、SQLServerで比較的簡単に実現できます。

だから私はテーブルを持っています(明確にするために簡略化されています)、例えば:

[  Runners  ]
[RunnerId int]
[DateRun DateTime]
[RaceTime float]

ここで、すべてのランナーのリストと最後のレースの時刻を含む要約が必要です。上記の表には、ランナーごとに複数のエントリがあることに注意してください。

SQLでは、これは次の方法で実現できます。

SELECT r.runnerId, r.DateRun, r.RaceTime
FROM (
    SELECT runnerId, MAX(DateRun) AS lastRace
    FROM Runners GROUP BY runnerId
) AS x INNER JOIN runners AS r ON
    r.runnerId = x.runnerId AND 
    r.DateRun = x.lastRace

公式のC#10genドライバーを使用しています。ヒントとポインタを歓迎します。

4

1 に答える 1

1

前に示したすべてのコメントのように、これは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オペレーターはrunnersbynameを並べ替え、次にd降順で並べ替えます。したがって、ランナー名ごとの最初のドキュメントは、各ランナーの最新の実行日である必要があります。次に、$groupオペレーターは、各ランナーについて、最新の実行日とそのレースの実行時間とともに、最初のドキュメントをプルします。

于 2012-11-26T22:52:58.623 に答える