如何更快地进行mongodb查询?

时间:2014-02-28 14:32:49

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

我有很多查询,例如sample1,sample2和sample3。 mongodb系列中有超过1300万条记录。所以这个查询得到了很长时间。有没有办法加快这个查询?

我认为使用IMongoQuery对象来解决这个问题。还有更好的办法吗?

样本1:

var collection = new MongoDbRepo().DbCollection<Model>("tblmodel");
decimal total1 = collection.FindAll()
                .SelectMany(x => x.MMB.MVD)
                .Where(x => x.M01.ToLower() == "try")
                .Sum(x => x.M06);

样本2:

var collection = new MongoDbRepo().DbCollection<Model>("tblmodel");
decimal total2 = collection.FindAll().Sum(x => x.MMB.MVO.O01);

样本3:

var list1= collection.FindAll()
                     .SelectMany(x => x.MHB.VLH)
                     .Where(x => x.V15 > 1).ToList();

var list2= list1.GroupBy(x => new { x.H03, x.H09 })
                         .Select(lg =>
                               new
                               {
                                   Prop1= lg.Key.H03,
                                   Prop2= lg.Count(),
                                   Prop3= lg.Sum(w => w.H09),
                               });

1 个答案:

答案 0 :(得分:3)

函数FindAll返回MongoCursor。将LINQ扩展方法添加到FindAll时,所有处理都在客户端上进行,而不是在数据库服务器上进行。每个文档都返回给客户端。理想情况下,您需要传递查询以使用Find来限制结果。

或者,您可以使用AsQueryable函数来更好地利用LINQ表达式和扩展方法:

var results = collection.AsQueryable().Where(....);

我不了解您的数据模型,因此我无法提供有关如何添加可过滤服务器上更多数据的查询的任何具体建议。

如果您确实需要将每个文档都返回给客户端进行处理,则可以在SetFields之后使用FindAll可链接方法来限制返回的字段。

您还可能会发现使用MongoDB聚合框架编写一些查询可能会产生类似的结果,而不会向客户端发送任何数据(结果除外)。或者,可能是Map-Reduce,具体取决于数据的性质。