2

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

4

1 回答 1

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
于 2013-01-21T17:18:52.150 回答