我是Haskell的初学者,我倾向于通过实践来学习。
有人能为我提供一个如何将光标与nextBatch或nextN一起使用的示例吗? http://hackage.haskell.org/packages/archive/mongoDB/1.3.1/doc/html/Database-MongoDB-Query.html#g:12
试过这样的事情(我试着写一个自定义的迭代函数,其中f是我想在所有文档上映射的函数)
let cursor = Mdb.find (Mdb.select selector collection)
-- consume :: IO ()
consume = do
r <- runAction db $ Mdb.nextBatch =<< cursor
if length (fromRight r) == 0
then return ()
else do
mapM_ f (fromRight r)
consume
consume
现在,它以无限循环运行,始终返回同一组文档。我想光标永远不会被修改?游标类型本身有一个MVar作为其中一个元素,首先我认为当我执行nextBatch时会更新,但这种情况从未发生过。
也许我应该按照它在Action monad(参见mongo驱动程序)中的方式重写递归,而不是IO?我被卡住了。
答案 0 :(得分:2)
当您编写let cursor = Mdb.find (Mdb.select selector collection)
时,它会创建仅在Action m Cursor
上下文中执行的Action m
,因此实际上您每=<< cursor
次创建一个新光标。
是的,我认为您应该在大多数Action m
上下文中重写您的功能。例如:
consume :: IO ()
consume = void $ runAction db $ do
cursor <- Mdb.find $ Mdb.select selector collection
go cursor
where
go cursor = Mdb.nextBatch cursor >>= \result -> case result of
[] -> return ()
xs -> mapM_ f xs >> go cursor