2013-01-19 48 views
2

我是Haskell的初學者,我傾向於通過干預來學習。Haskell mongoDB驅動程序(1.3.1)光標迭代示例

有人能給我一個如何在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?我被卡住了。

回答

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 
+0

謝謝。我沒有嘗試這個解決方案,但你的解釋聽起來很合理。 –

相關問題