MongoDb C#驱动程序 - 索引字段获取项目非常慢

时间:2016-06-01 14:51:15

标签: c# mongodb performance mongodb-query mongodb-.net-driver

在小型本地数据库中获取过滤数据时遇到了性能问题。我减少了代码(如下所示)来重现问题。输出大约是2000ms。

其他一些信息:

  • 查询的集合包含135,000个条目,每个条目有7个简单类型
  • 在RoboMongo中运行类似查询时 - db.TickerData.find({_ id:ObjectId('5731d39062deb83134772e77')})。explain() - totalExecutionTime< 1ms
  • 我使用的是最新的MongoDb服务器和C#驱动程序版本
  • 数据库在同一个开发/调试环境中本地运行(四核16Mb Ram)
  • 我发现当在除ID以外的其他字段上进行测试时索引和非索引字段之间的性能没有差异(总是被索引)
  • 我的第一个问题是.Single()linq操作在执行单个搜索之前检索所有文档但是从谷歌看来,似乎所有linq操作都转换为MongoDB服务器端查询

代码:

public class UnitTest1
{
    public void TestMethod2()
    {
        Stopwatch sw = new Stopwatch();
        sw.Start();
        new BaseRepository<TickerData>().GetById("5731d39062deb83134772e77");
        sw.Stop();
        Debug.Write(sw.Elapsed.TotalMilliseconds);
    }
}

public class BaseRepository<T> : MongoBase where T : BaseEntity
{
    MongoDatabase DataBase { get; set; }
    protected IQueryable<T> Collection { get; set; }
    MongoCollection<BsonDocument> mCollection { get; set; }

    public BaseRepository()
    {
        DataBase = Server.GetDatabase("TradingBot");
        mCollection = DataBase.GetCollection<BsonDocument>(typeof(T).Name);
        Collection = mCollection.AsQueryable<T>();
    }

    public T GetById(string ID)
    {
        return Collection.Single(i => i.Id.ToString() == ID);
    }

}

更新: 建议根据@rnofenko(见评论)取得了巨大的进步,但似乎仍然有点慢?

1 个答案:

答案 0 :(得分:1)

这是一个棘手的时刻。 您可以从 System.Linq 调用扩展方法单个。实际上,您从DB加载整个集合,并在应用程序中按ID进行选择。

相反,您需要使用MongoDB扩展方法 - MongoDB.Driver.Linq 中的 SingleAsync

public async Task<T> GetById(string id)
{
    return await Collection.SingleAsync(x => x.Id == new ObjectId(id));
}