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; }
}

我计划将其展平以存储到 mongo db 中,如下所示:

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; }
}

我担心的是,这会使查询更加困难吗?
有没有办法可以对它进行分类以使其更容易?

所以我可以做如下查询:

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

它会查询我的底层、平面(非嵌入式)数据以返回 Result 的实例?

这可能吗?

或者,我应该在我的应用程序中使用我的 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 中将只有 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 回答