首页 > 解决方案 > Mongo查询限制未在操作中显示

问题描述

我正在使用 MongoDB.Driver for .NET 来查询 Mongo(版本 3.0.11)。这是我查询字段并将查询限制为 200 个文档的代码。

BsonDocument bson = new BsonDocument();
bson.Add("Field", "Value");
BsonDocumentFilterDefinition<ResultClass> filter      = new BsonDocumentFilterDefinition<ResultClass>(bson);
FindOptions                               queryOptions    = new FindOptions() { BatchSize = 200 };
List<ResultClass> result = new List<ResultClass>();
result.AddRange(myCollection.Find<ResultClass>(filter, queryOptions).Limit(200).ToList());

我的问题是,当我检查数据库的当前操作时,操作查询字段仅显示:

{字段:“值”}

这与下面使用“AsQueryable”的查询不同:

List<ResultClass> result = myCollection.AsQueryable<ResultClass>().Where(t => t.Field == "Value").Take(200)

使用“AsQueryable”进行查询操作

{聚合:“CollectionName”,管道:[ { $match:{字段:“Value”}},{ $limit:200 }],光标:{}}

为什么我在使用 Find 的查询中看不到限制?限制是在客户端而不是服务器处理的吗?我需要在服务器端对此进行限制,但我不能使用第二个查询,因为搜索的字段需要是无法使用 AsQueryable 完成的字符串。

标签: c#mongodbmongodb-query

解决方案


在第一段代码中使用 limit 会对游标对象执行限制,在您通过调用 ToList() 实际请求文档之前,该对象仍然是服务器端的。此时只有 200 个文档会通过网络传输到您的应用程序。

看起来 AsQueryable 正在执行一个聚合管道,该管道将显示在 currentOp 中,但两者本质上是相同的。

我不确定是否对任何一个都有性能影响


推荐阅读