C# - 运行40次Foreach迭代需要5秒

时间:2016-03-07 18:57:37

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

以下代码需要5秒才能完成40次迭代。我不认为这与MongoDb有任何关系,因为过滤器应该立即构建,并且应该在这里进行调用,而不是等待。如果您在此处看到每次迭代需要超过1000秒的任何内容,请告诉我们:

//There are 40 categories
foreach (var category in categories)
{
var filter = Builders<BsonDocument>.Filter.In("CurrentOfficeId", officesIds)
            & Builders<BsonDocument>.Filter.Eq("CategoryId", category.Id);

if (userId > 0) filter &= Builders<BsonDocument>.Filter.Eq("SubmittedById", userId);

pendingCallsForItemCountPerCatArray[numberOfCatBeingIterated] = mongoItemsCollection
                                                                    .Find(filter)
                                                                    .CountAsync();
}

编辑:请注意,我尝试在上一次调用完成之前进行每次调用。否则代码如下:

callResult[numberOfCatBeingIterated] = await mongoItemsCollection

编辑2:我确认该呼叫正在生成Task<long>,而不是长。我还确认,通过注释掉调用会将迭代次数降低到0秒,我们知道,但我只是在确认。

2 个答案:

答案 0 :(得分:1)

可能是因为你总是用.Find(过滤器)迭代mongoItemsCollection吗?

答案 1 :(得分:1)

每当代码“花费很长时间”执行时 - 这是一个很好的理由看看mongoDB中的内容: - )。

  1. 在分析器模式下设置mongo
  2.   

    db.setProfilingLevel(2,20)

    1. 然后检查那里发生了什么
    2.   

      db.system.profile.find()。limit(100).sort({ts:-1})。pretty()

      1. 完成后
      2.   

        db.setProfilingLevel(0)

        因为一次有40个呼叫,每次呼叫125毫秒/看起来相当不错(想象一下你在每次查询时都有锁)