MongoDB升级后聚合操作报错:需配置cursor选项(无需换驱动)
解决MongoDB升级后聚合操作的"cursor选项必填"异常
这个问题是因为MongoDB 3.6及以上版本对aggregate命令做了强制要求:除了带explain参数的聚合操作外,所有聚合必须指定cursor选项。你的旧代码直接传入管道但没有配置cursor,所以触发了这个错误。不用更换驱动,只需要在聚合调用时添加cursor配置即可,具体修改如下:
步骤1:添加AggregateOptions配置
在你的管道构造代码之后,创建AggregateOptions对象并设置Cursor属性(可以指定批处理大小,或者传空对象满足服务器要求):
BsonArray arr = BsonSerializer.Deserialize<BsonArray>("[{ \"$match\" : { \"Param1\" : \"VAL\" } }, { \"$unwind\" : \"$Entries\" }, { \"$match\" : { \"PARAM\" : \"VALUE\" } }]"); var pipeline = arr.Select(x => x.AsBsonDocument).ToList(); // 新增:配置cursor选项 var aggregateOptions = new AggregateOptions { // 可以设置合适的批处理大小,比如1000;如果不需要指定大小,传new CursorOptions()也可以 Cursor = new CursorOptions { BatchSize = 1000 } };
步骤2:使用带选项的Aggregate重载
把配置好的aggregateOptions传给Aggregate方法,替代原来只传管道的调用:
// 替换原有的Aggregate调用,添加选项参数 var results = collection.Aggregate(pipeline, aggregateOptions).ToList();
为什么这样有效?
MongoDB服务器现在要求aggregate命令必须携带cursor参数(格式类似{cursor: {batchSize: 1000}}),通过驱动的AggregateOptions配置Cursor属性,会自动在底层命令中添加这个必填参数,从而解决FailedToParse错误。
如果你不需要自定义批处理大小,也可以直接设置Cursor = new CursorOptions(),空的cursor对象同样能满足服务器的要求。
内容的提问来源于stack exchange,提问作者user3066027
相关产品推荐
相关产品推荐

