带有C#驱动程序的MongoDB光标快照
我有一个大的集合,我需要遍历它。我正在使用光标进行此操作 然而,我注意到我有时会从这个游标中得到重复的记录。我读了一些书,发现我可以通过使用快照来解决这个问题 光标隔离 当光标返回文档时,其他操作可能会与查询交错。对于MMAPv1存储引擎,如果文档发生更改,则对文档进行中间写入操作可能会导致游标多次返回文档。要处理这种情况,请参阅有关游标快照的信息 但是,我在C#驱动程序(版本2.7)中找不到这种方法。我在带有C#驱动程序的MongoDB光标快照,c#,mongodb,cursor,C#,Mongodb,Cursor,我有一个大的集合,我需要遍历它。我正在使用光标进行此操作 然而,我注意到我有时会从这个游标中得到重复的记录。我读了一些书,发现我可以通过使用快照来解决这个问题 光标隔离 当光标返回文档时,其他操作可能会与查询交错。对于MMAPv1存储引擎,如果文档发生更改,则对文档进行中间写入操作可能会导致游标多次返回文档。要处理这种情况,请参阅有关游标快照的信息 但是,我在C#驱动程序(版本2.7)中找不到这种方法。我在FindFluent或FindOptions中看不到它 有人能给我举个例子,说明如何通过C
FindFluent
或FindOptions
中看不到它
有人能给我举个例子,说明如何通过C#MongoDB驱动程序创建光标快照吗
下面是我的代码的样子
private async Task<int> IterateViaCursor<P>(FilterDefinition<User> filter, ProjectionDefinition<User, P> pdef, Func<IEnumerable<P>, Task> callback, int batchSize)
where P : class
{
var o = new FindOptions { BatchSize = batchSize };
var count = 0;
var findFluent = Users.Find(filter, o).Project(pdef);
using (var cursor = await findFluent.ToCursorAsync())
{
while (await cursor.MoveNextAsync())
{
var batchCount = cursor.Current.Count();
count += batchCount;
if (batchCount > 0)
await callback(cursor.Current.ToList());
}
}
return count;
}
专用异步任务迭代器ACURSOR(FilterDefinition筛选器、ProjectOnDefinition pdef、Func回调、int batchSize)
其中P:类
{
var o=新的FindOptions{BatchSize=BatchSize};
var计数=0;
var findFluent=Users.Find(filter,o).Project(pdef);
使用(var cursor=await findFluent.ToCursorAsync())
{
while(等待cursor.MoveNextAsync())
{
var batchCount=cursor.Current.Count();
计数+=批次计数;
如果(批处理计数>0)
等待回调(cursor.Current.ToList());
}
}
返回计数;
}
MongoDB 4.0的快照已被弃用,然后被删除。因此,您“阅读了一些关于快照的旧帖子”,但这实际上只是一个“创可贴”,而不是一个真正的解决方案,因此删除了。相反,请向我们解释“为什么”您认为需要迭代一个长光标,以及您正在使用的实际代码显示这些“副本”“。即使您使用的是较旧的MongoDB服务器,代码的解决方案也不应是使用快照选项的解决方案。我之所以要使用快照,是因为我在迭代游标时得到了重复的记录。我用更多的信息更新了我的问题,你能提供一个真实再现行为的方法吗?提供的代码看起来不错,因此任何问题都可能与正在发生的其他事情或其他配置有关。请注意,如果您按照问题中的链接进行操作以弃用和删除,那么很明显,“快照”实际上并没有达到大多数人期望的效果,而且还与现在已删除的MMAPv1存储引擎相关联。较新的存储引擎在默认情况下具有不同的读取隔离。我们将讨论其他内容,但这是实际使用的代码吗?如果是这样,那么你在这里真正做的就是“计算”结果。除非这里没有包含代码的其他用途,否则有一种更有效的方法来实现这一点,而不是迭代游标和递增计数器。具体地说,我只需要检查一下,因为一些语言API现在调用thiscountDocuments()
或类似的方法,但这里没有更改。这是统计查询结果的推荐可靠方法。