Haskell mongoDB驱动程序(1.3.1)游标迭代示例

时间:2013-01-19 19:22:00

标签: haskell

我是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?我被卡住了。

1 个答案:

答案 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