mongodb - 为什么我的 .NET MongoDb 驱动程序查询非常慢?

标签 mongodb mongodb-query mongodb-.net-driver

我直接在 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 看到的查询:

enter image description here

编辑:看起来将项目映射到项目对象在某种程度上扼杀了我的查询。在没有映射的情况下,它相当快(大量记录只需几秒钟),如下所示:

    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/

相关文章:

c# - MongoDB C# 驱动程序 - 如何将 _id 存储为 ObjectId 但映射到字符串 Id 属性?

mongodb - 如何正确创建索引mongodb?

c# - 带有 setFields 和 AsQueryable 的 Mongodb c# 驱动程序 FindAll

mongodb - 如何在mongodb中找到两个日期之间的时差

c# - 通用列表未插入到 MongoDB 中

c# - 从遗留 UUID 迁移到标准 UUID

c# - 如何在 MongoDB C# 驱动程序中使用 "Or"语句?

node.js - Openshift mongodb 连接 url

angularjs - 需要在mongodb中执行push操作不行

mongodb - 在 mongodb 中四舍五入到小数点后两位