执行可以处理所有大量文档的原始查询 mongo 驱动程序 c#
Execute raw query that could handle all numerous of documents mongo driver c#
我的情况是收集的过滤条件很长。我更喜欢手动编写它并使用 C# 驱动程序中的 mongoDb RunCommandAsync
方法来获取 Bson 文档作为结果,然后将其反序列化回对象。
正如 doc 所说,它将 return 一个 BsonDocument,而不是一个 Cursor 来迭代。
我从一个集合中做了一个小测试,如下所示,我从 robo 3T 得到了 ~215k 文档,但是当涉及到 c# 中的 RunCommandAsync
时,它默认为 return 101文件。我试图将 batchSize
增加到 200.000,但执行只能 return ~22k 文档(我猜这是每个批处理操作 4MB 的限制)。
var cmdDoc = @"{
'find': 'NotificationHistories',
'filter': {'CreatedTime': {$exists: true}}
'batchSize': 200000,
'singleBatch': true
}";
var cmd = new JsonCommand<BsonDocument>(cmdDoc);
var res = await database.RunCommandAsync(cmd, ReadPreference.PrimaryPreferred, CancellationToken.None);
所以我的最后一个问题是:
有没有我们可以执行原始查询来处理所有大量文档的方法?
结果可以是 Cursor、BsonDocument、Array of BsonDocument 中的任何一个,...
或者没有解决此问题的方法,只能使用 Collection 的正常 Find
或 Aggregate
方法?
任何线索都是有用的,因为我觉得写那些特别是 Unwind
、Group
、Lookup
、...
的东西很长很麻烦
101 条记录是光标的第一个批次中的一些记录,下一条记录的迭代(逐批次)应该通过 getMore 命令完成(但我认为你认为这是错误的方式,我认为没有理由避免常规方式)。
我的情况是收集的过滤条件很长。我更喜欢手动编写它并使用 C# 驱动程序中的 mongoDb RunCommandAsync
方法来获取 Bson 文档作为结果,然后将其反序列化回对象。
正如 doc 所说,它将 return 一个 BsonDocument,而不是一个 Cursor 来迭代。
我从一个集合中做了一个小测试,如下所示,我从 robo 3T 得到了 ~215k 文档,但是当涉及到 c# 中的 RunCommandAsync
时,它默认为 return 101文件。我试图将 batchSize
增加到 200.000,但执行只能 return ~22k 文档(我猜这是每个批处理操作 4MB 的限制)。
var cmdDoc = @"{
'find': 'NotificationHistories',
'filter': {'CreatedTime': {$exists: true}}
'batchSize': 200000,
'singleBatch': true
}";
var cmd = new JsonCommand<BsonDocument>(cmdDoc);
var res = await database.RunCommandAsync(cmd, ReadPreference.PrimaryPreferred, CancellationToken.None);
所以我的最后一个问题是:
有没有我们可以执行原始查询来处理所有大量文档的方法? 结果可以是 Cursor、BsonDocument、Array of BsonDocument 中的任何一个,...
或者没有解决此问题的方法,只能使用 Collection 的正常 Find
或 Aggregate
方法?
任何线索都是有用的,因为我觉得写那些特别是 Unwind
、Group
、Lookup
、...
101 条记录是光标的第一个批次中的一些记录,下一条记录的迭代(逐批次)应该通过 getMore 命令完成(但我认为你认为这是错误的方式,我认为没有理由避免常规方式)。