1

レース結果や時間などを使ったモデルを開発しています。
次のようなモデルがあります。

public class Competitor
{
    public int ID { get; set; }
    public string Name { get; set; }
    public DateTime DateOfBirth { get; set; }
}

public class Event
{
    public int ID { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
}

public class Result
{
    public int ID { get; set; }
    public decimal ResultTime { get; set; }
    public Competitor Competitor { get; set; }
    public Event Event { get; set; }
}

次のように、mongodbに保存するためにこれをフラット化することを計画しています。

public class ResultSchemaExample
{
    public int CompetitorID { get; set; }
    public string CompetitorName { get; set; }
    public DateTime CompetitorDateOfBirth{ get; set; }
    public int EventID { get; set; }
    public string EventName { get; set; }
    public string EventDescription { get; set; }
    public int ResultID { get; set; }
    public decimal ResultTime { get; set; }
}

私の懸念は、これによりクエリが少し難しくなるということです。
これをclassMapして簡単にする方法はありますか?

だから私は次のようなクエリを行うことができます:

var query =
    collection.AsQueryable<Result>()
    .Where(r => r.Name == "Alex");

そして、結果のインスタンスを返すために、基になるフラットな(埋め込まれていない)データをクエリしますか?

これは可能ですか?

または、アプリ全体でResultSchemaExampleを使用しますか?

4

1 に答える 1

1

いつでもこのようなコンポジションクラスを作成して、mongodbに保存できます。

public class RaceResults
{
  public Competitor Competitor { get; set;}
  public Event Event { get; set;}
  public Result Result { get; set;}
}

クエリは次のようになります。

var query = collection.AsQueryable<RaceResults>().Where(r => r.Result.Name == "Alex");

ただし、おそらく完全に別のスキーマを提案します...ドメインから始めて、イベントなしでは結果を取得できないというルールがあると確信しています。それは私があなたのドメインを少し異なって設計することにつながるでしょう。このように:

public class Event
{
  public string Name { get; set; }
  public string Description { get; set; }
  public IList<Result> Results { get; set; }
}

public class Result
{
  public Competitor Competitor { get; set; }
  public TimeSpan ResultTime { get; set; }
}

public class Competitor
{ ... }

このスキーマを使用すると、mongodbにはeventsという1つのコレクションしかありません。各イベントには、必要なすべてのデータが含まれます。mongodbは配列やドキュメント内のクエリをサポートしているため、イベント間で競合他社の結果を関連付けることもかなり簡単です。したがって、以下のクエリは、競合他社42が競合したすべてのイベントを取得します。

var collection = db.GetCollection<Event>("events");
var query = Query.EQ("Results.Competitor.Id", 42);
var events = collection.Find(query);
于 2012-06-25T12:17:29.400 に答える