如何在MongoDB的BsonDocument查询语句中直接限制返回结果?
问题
我正在开发一个API,允许通过发送原始BsonDocument进行查询,该API使用MongoClient获取查询结果。代码如下:
public async Task<string> Query(string database, string collection, string qry){ var db = Connection.Client.GetDatabase(database); var col = db.GetCollection<BsonDocument>(collection); var filter = BsonDocument.Parse(qry); var result = await col.FindAsync(filter); string json = ""; await result.ForEachAsync(b => json += toJson(b)); return json; }
请问是否可以在BsonDocument本身中添加相关配置来限制查询结果?
答案
不能直接在作为查询条件的BsonDocument里添加limit配置——这个BsonDocument对应的是MongoDB查询的filter参数,仅用于筛选符合条件的文档,不包含分页、结果数量限制这类执行选项。
有两种可行的解决方案:
- 方案1:新增参数传递limit值
修改API,额外接收limit参数,在调用FindAsync时通过FindOptions配置结果数量限制:
public async Task<string> Query(string database, string collection, string qry, int? limit = null){ var db = Connection.Client.GetDatabase(database); var col = db.GetCollection<BsonDocument>(collection); var filter = BsonDocument.Parse(qry); var options = new FindOptions<BsonDocument>(); if(limit.HasValue) options.Limit = limit.Value; var result = await col.FindAsync(filter, options); string json = ""; await result.ForEachAsync(b => json += toJson(b)); return json; }
- 方案2:自定义字段解析limit
如果必须通过单个BsonDocument传递所有参数,可以和调用方约定一个特殊字段(比如$limit),在代码中提取该字段后移除,再将其设置到查询选项中:
public async Task<string> Query(string database, string collection, string qry){ var db = Connection.Client.GetDatabase(database); var col = db.GetCollection<BsonDocument>(collection); var queryDoc = BsonDocument.Parse(qry); int? limit = null; // 提取并移除自定义的$limit字段 if(queryDoc.Contains("$limit") && queryDoc["$limit"].IsInt32){ limit = queryDoc["$limit"].AsInt32; queryDoc.Remove("$limit"); } var filter = queryDoc; var options = new FindOptions<BsonDocument>(); if(limit.HasValue) options.Limit = limit.Value; var result = await col.FindAsync(filter, options); string json = ""; await result.ForEachAsync(b => json += toJson(b)); return json; }
注意:这种自定义字段的方式属于非标准约定,需要确保不会和MongoDB原生查询操作符冲突,且API调用方需遵循该约定。
内容的提问来源于stack exchange,提问作者Serve Laurijssen
相关产品推荐
相关产品推荐

