【问题标题】:Mongodb AsQueryable() 性能
【发布时间】:2022-01-23 16:11:43
【问题描述】:

我有这样的代码,我想使用 Linq 查询 MongoDB。

我从 MongoDB 集合中得到一个 AsQueryable。

public IEnumerable<IVideo> GetVideos()
{
    var collection = database.GetCollection<IVideo>("Videos");
    return collection.AsQueryable();
}

我这样称呼它,

var finalList = Filter2(Filter1(GetVideos())).Skip(2).Take(30);
foreach(var v in finalList)
{
    .... 
}

查询的功能。

public IEnumerable<IVideo> Filter1(IEnumerable<IVideo> list)
{
    return list.Where(q=>q.Categorized)
}


public IEnumerable<IVideo> Filter2(IEnumerable<IVideo> list)
{
    var query = from d in list
        where d.File == "string1" || d.File == "string2" 
                select d;
    return query;
}

我的代码运行良好。我的代码托管在 IIS 中,大约有 50,000 条记录,查询比示例稍微复杂一些。当调用 foreach 时,我的工作进程飙升至 17% 并且需要几秒钟才能执行。对于如此低的日期数量,这是一个荒谬的高。

我有几个问题。

  1. 查询是由 .net 还是 MongoDB 执行的?如果它是由 MongoDB 执行的,为什么我的工作进程会受到如此大的打击?
  2. 我可以采取哪些步骤来缩短呈现查询的执行时间并减少服务器负载。

谢谢

【问题讨论】:

    标签: c# asp.net mongodb iis asqueryable


    【解决方案1】:

    您无意中在客户端下载了所有条目

    public IEnumerable<IVideo> Filter1(IEnumerable<IVideo> list)
    {
        var list = list.Where(q=>q.Categorized)
    }
    

    IEnumerable 使可查询对象执行并返回结果。将过滤方法更改为接受并返回IQueryable

    编辑:

    您发布的代码:

    public IEnumerable<IVideo> Filter1(IEnumerable<IVideo> list)
    {
        var list = list.Where(q=>q.Categorized)
    }
    

    不编译。

    您的代码应如下所示:

    public IQueryable<IVideo> Filter1(IQueryable<IVideo> qVideos)
    {
        return qVideos.Where(q => q.Categorized);
    }
    
    public IQueryable<IVideo> Filter2(IQueryable<IVideo> qVideos)
    {
        return qVideos
            .Where(e => e.File == "string1" || e.File == "string2");
    }
    
    public DoSomething()
    {
    
        // This is the query, in debug mode you can inspect the actual query generated under a property called 'DebugView'
        var qVideos = Filter2(Filter1(GetVideos()))
            .Skip(1)
            .Take(30);
    
        // This runs the actual query and loads the results client side.
        var videos = qVideos.ToList();
    
        // now iterated
    
        foreach (var video in videos)
        {
            
        }
    
    }
    

    【讨论】:

    • 要公开 IQueryable Filter1(IQueryable list)?
    • 这正是我要说的。
    • @thewayman 用更全面的样本更新了 Q。
    • 谢谢 还有一个问题,您已更改 var query = from d in list where d.File == "string1" || d.File == "string2" 选择 d;返回查询; to chain 方法这前面的部分有什么问题吗?
    • @thewayman 我不这么认为 - 但我更喜欢其他语法,因为我是 c# 开发人员而不是数据库工程师。
    猜你喜欢
    • 2014-08-02
    • 1970-01-01
    • 2014-06-02
    • 1970-01-01
    • 2021-01-04
    • 2013-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多