我直接在 Mongo(Robomongo、CLI 等)中运行查询以选择 field1=x、field2=y 和 field3=z 的所有项目
,并且在多个项目上花费的时间不到一秒十万项:
db.items.find( {
$and: [
{ CreatingOrgId: 1 },
{ LocationId: 941 },
{ StatusId: 1}
]
} )
然后我尝试从 C# 驱动程序运行完全相同的东西,但它滞后了(只有“聚合过滤器”代码是相关的,其他一切都是为了上下文):
FilterDefinition<BsonDocument> locationsFilter; = Builders<BsonDocument>.Filter.Eq("LocationId", 941);
FilterDefinition<BsonDocument> orgFilter = Builders<BsonDocument>.Filter.Eq("CreatingOrgId", 1);
FilterDefinition<BsonDocument> statusFilter = Builders<BsonDocument>.Filter.Eq("StatusId", 1);
FilterDefinition<BsonDocument> aggregateFilter = locationsFilter & statusFilter & orgFilter;
List<ItemViewModel> stuffList = mongoItemsCollection
.Find(aggregateFilter)
.Project(x => Mapper.Map<BsonDocument, StuffViewModel>(x))
.ToListAsync().Result;
我这里有什么错误?以下是 mongo 看到的查询:
编辑:看起来将项目映射到项目对象在某种程度上扼杀了我的查询。在没有映射的情况下,它相当快(大量记录只需几秒钟),如下所示:
var rawItems = mongoItemsCollection
.Find(aggregateFilter)
.ToListAsync().Result;
编辑 2:看起来 automapper 是这里问题的一个巨大部分(获取 bson“item”对象并将其转换为 .NET View 模型)。我仍然对优化 .NET --> mongo 查询本身感兴趣(忽略自动映射器部分),如果有人想回答的话。
最佳答案
当您在 C# 中运行 .ToListAsync()
时,将访问并返回查询的全部结果。
而当您在命令行上运行 .find()
时,只会返回 20(默认)。
命令行上更等效的测试是 .find().toArray()
,它也将访问并返回所有结果。或者您可以在 C# 查询中设置限制。
如果您的完整结果集比 shell 批处理大小大很多,这可能会导致您的结果出现一些差异。如果查询未被覆盖(即查询中的所有字段和返回的所有字段不在同一个索引中)并且如果访问的数据不在内存中而是从磁盘访问,这种差异将更糟。
关于mongodb - 为什么我的 .NET MongoDb 驱动程序查询非常慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35372702/