简体   繁体   English

使用基于搜索的C#驱动获取MongoDB集合的子集合

[英]Get subcollection of MongoDB collection with C# driver based on search

I have this project with https://github.com/Mech0z/Foosball/blob/master/Models/Old/PlayerRankHistory.cs我有这个项目https://github.com/Mech0z/Foosball/blob/master/Models/Old/PlayerRankHistory.cs

I have the following classes where PlayerRankHistory is saved in MongoDB, this contains a list of PlayerRankHistorySeasonEntry which each contains PlayerRankHistoryPlot.我有以下类,其中 PlayerRankHistory 保存在 MongoDB 中,其中包含 PlayerRankHistorySeasonEntry 的列表,其中每个都包含 PlayerRankHistoryPlot。

I would then like to provide an email of a player and a seasonname and then only get the list PlayerRankHistoryPlots out as a list, but the code I have written is very slow and not faster than just providing only an email and getting much more data out然后我想提供一个球员的电子邮件和一个赛季名称,然后只将 PlayerRankHistoryPlots 列表作为列表列出,但我编写的代码非常慢,而且不比仅提供电子邮件和获取更多数据快

And as a side note, not sure how to write it to make it async作为旁注,不知道如何编写它以使其异步

The query I have now is我现在的查询是

public async Task<List<PlayerRankHistoryPlot>> GetPlayerRankEntries(string email, string seasonName)
{
    var query = Collection.AsQueryable().SingleOrDefault(x => x.Email == email)
        .PlayerRankHistorySeasonEntries.SingleOrDefault(x => x.SeasonName == seasonName).HistoryPlots;
    List<PlayerRankHistoryPlot> result = query.ToList();
    return result;
}


public class PlayerRankHistory
{
    public PlayerRankHistory(string email)
    {
        Email = email;
        PlayerRankHistorySeasonEntries = new List<PlayerRankHistorySeasonEntry>();
    }

    public Guid Id { get; set; }
    public string Email { get; set; }
    public List<PlayerRankHistorySeasonEntry> PlayerRankHistorySeasonEntries { get; set; }
}

public class PlayerRankHistorySeasonEntry
{
    public PlayerRankHistorySeasonEntry(string seasonName)
    {
        SeasonName = seasonName;
        HistoryPlots = new List<PlayerRankHistoryPlot>();
    }

    public string SeasonName { get; set; }
    public List<PlayerRankHistoryPlot> HistoryPlots { get; set; }
}

public class PlayerRankHistoryPlot
{
    public PlayerRankHistoryPlot(DateTime date, int rank, int eloRating)
    {
        Date = date;
        Rank = rank;
        EloRating = eloRating;
    }

    public DateTime Date { get; set; }
    public int Rank { get; set; }
    public int EloRating { get; set; }
}

An example of a document文档示例

{"_id":"AYU3e3Qgw0Gut1fngze80g==","Email":"someemail@gmail.com","PlayerRankHistorySeasonEntries":[{"SeasonName":"Season 1","HistoryPlots":[{"Date":"2020-01-10T12:24:12.511Z","Rank":11,"EloRating":1488},{"Date":"2020-01-13T12:51:41.597Z","Rank":12,"EloRating":1488},{"Date":"2020-01-15T11:11:43.223Z","Rank":10,"EloRating":1510},{"Date":"2020-01-15T11:11:45.049Z","Rank":8,"EloRating":1530},{"Date":"2020-01-15T12:14:58.042Z","Rank":9,"EloRating":1530},{"Date":"2020-01-15T12:14:59.886Z","Rank":8,"EloRating":1530}]}]}

I believe when you define Collection.AsQueryable().FirstOrDefault() , you are pulling all records in that collection and then filtering through them.我相信当您定义Collection.AsQueryable().FirstOrDefault() ,您是在提取该集合中的所有记录,然后通过它们进行过滤。 You should use the Find() method that is provided by MongoDB C# driver to filter the records which is much faster as well.您应该使用 MongoDB C# 驱动程序提供的Find()方法来过滤记录,这也更快。

  1. Get the PlayerRankHistory objects based on the email address根据电子邮件地址获取 PlayerRankHistory 对象
  2. From on the filtered records, only return the records that have the required season从过滤的记录中,只返回具有所需季节的记录
  3. Get the HostoryPlots for only the first match as list仅获取第一个匹配项的 HostoryPlots 作为列表
Collection.Find(Builders<PlayerRankHistory>.Filter.Eq(x => x.Email, email))
            .Select(y => y.PlayerRankHistorySeasonEntries.Where(z => z.SeasonName.Equals(seasonName)))
            .FirstOrDefault()?.HistoryPlots
            .ToList();

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM