簡體   English   中英

映射子類/使用MongoDB C#驅動程序嵌入到單個平面文檔

[英]Mapping subclasses / embedded to single flat document with MongoDB C# driver

我正在開發一個應用程序,該應用程序具有使用競賽結果/時間等的模型。
我有一個看起來像這樣的模型:

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

我擔心的是,這會使查詢變得更加困難嗎?
有沒有一種方法可以使classMap變得更簡單?

因此,我可以執行以下查詢:

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

它會查詢我的基礎,平坦(非嵌入式)數據以返回Result實例嗎?

這可能嗎?

還是我應該在整個應用程序中使用ResultSchemaExample?

您總是可以擁有這樣的合成類,並將其存儲在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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM