MongoCursor.Count 与 IAsyncCursor.Count 有什么区别?

4

有人知道在新的驱动程序(IAsyncCursor)中等效于遗留MongoCursor的“Count”方法在哪里吗?或者有人知道我如何使用2.0 Async Driver / Methods复制它吗?

思路是使用分页(跳过和限制)查询文档,并且仅用一个数据库访问获取文档,返回文档计数以及找到的所有文档计数而没有LIMIT。

使用MongoDB C#遗留驱动程序,我曾经这样做:

MongoCursor<SaleOrderModel> result = collection.FindAs<SaleOrderModel>(query);

result.setSkip(20);
result.setLimit(10);

var saleOrders = result.ToList<SaleOrderModel>(); // 'limited' documents
var size = result.Size(); // Count of 'limited' documents
var count = result.Count(); // Count of all documents found (even if they are not returned)
1个回答

2
你可以使用2.0驱动程序,通过Find返回的IFindFluent查询接口来实现此操作:
// Create the IFindFluent<SaleOrderModel> query.
var collection = db.GetCollection<SaleOrderModel>("saleOrders");
var filter = Builders<SaleOrderModel>.Filter.Eq(so => so.vendorId, 5);
var query = collection.Find(filter);

// Get the count of all docs matching the query.
var count = await query.CountAsync();

// Execute the query with skip and limit.
var saleOrders = await query.Skip(20).Limit(10).ToListAsync();
var size = saleOrders.Count();

做到了它所说的。它与现有的FindAsync操作略有不同。在检查system.profile时,我可以看到它已执行查询操作,但我无法看到对mongo的调用来调用计数。是否可能证明它正在利用相同的游标? - James
1
啊 - 我可以看到它执行了一个包含Count指令的“command”操作,但它没有与游标关联。我很想知道它是否适当地引起了索引或表扫描,一次用于Count,一次用于Find。 - James
没错,从语法上和逻辑上来看,这是一个常见的查询,但在服务器端,我希望它们每个都使用独立的查询计划,每个查询计划都经过优化,以获取所请求的数据。传统的C#方法也会这样做。 - JohnnyHK

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接