Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带有C#驱动程序的MongoDB光标快照_C#_Mongodb_Cursor - Fatal编程技术网

带有C#驱动程序的MongoDB光标快照

带有C#驱动程序的MongoDB光标快照,c#,mongodb,cursor,C#,Mongodb,Cursor,我有一个大的集合,我需要遍历它。我正在使用光标进行此操作 然而,我注意到我有时会从这个游标中得到重复的记录。我读了一些书,发现我可以通过使用快照来解决这个问题 光标隔离 当光标返回文档时,其他操作可能会与查询交错。对于MMAPv1存储引擎,如果文档发生更改,则对文档进行中间写入操作可能会导致游标多次返回文档。要处理这种情况,请参阅有关游标快照的信息 但是,我在C#驱动程序(版本2.7)中找不到这种方法。我在FindFluent或FindOptions中看不到它 有人能给我举个例子,说明如何通过C

我有一个大的集合,我需要遍历它。我正在使用光标进行此操作

然而,我注意到我有时会从这个游标中得到重复的记录。我读了一些书,发现我可以通过使用快照来解决这个问题

光标隔离 当光标返回文档时,其他操作可能会与查询交错。对于MMAPv1存储引擎,如果文档发生更改,则对文档进行中间写入操作可能会导致游标多次返回文档。要处理这种情况,请参阅有关游标快照的信息

但是,我在C#驱动程序(版本2.7)中找不到这种方法。我在
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现在调用this
countDocuments()
或类似的方法,但这里没有更改。这是统计查询结果的推荐可靠方法。