2017-03-09 12 views
0

ファイルを読み取り、その情報をmongoldbコレクションに保存するプログラムを作成しようとしています。このプログラムは、mongodbドライバのサンプルプログラムに基づいています。 テストのために、私はtestdatenでいくつかの定数を定義し、プログラムはこのデータで動作します。 STMTでは、すなわち、insertManyの第2引数には、実際のタイプIO [[Data.Bson.Field]]getWetterDatenHaskell Mongodbファイルからレコードを挿入する

insertMany「DATEN」getWetterDaten 予想と一致しませんでしタイプ[Document] :私は、ファイルデータを挿入しようとすると、私は型エラーを取得しますdoブロックの:insertMany "daten" getWetterDaten

私はこの問題は、そのtestdatenがType testDaten :: [[Data.Bson.Field]]getWetterDatenType getWetterDaten :: IO [[Data.Bson.Field]]、 を持っていますが、どのように私はこの問題を解決することができますを持っていることを知っていますか?

私はメッセージを取得insertData2にパラメータとしてデータを渡すためにしてみてください。

Couldn't match type ‘Control.Monad.Trans.Reader.ReaderT 
        Database.MongoDB.Query.MongoContext m1 [Value]’ 

遠くハスケルの私の理解を超えて間違いです。

別の観察は、私は型宣言 を含めるようにしようと、私はエラーメッセージを取得することである:

Not in scope: type constructor or class `Data.Bson.Field` 

のMongoDBへのファイルのデータを挿入するための正しい方法は何ですか?

{-# LANGUAGE OverloadedStrings #-} 
    {-# LANGUAGE ExtendedDefaultRules #-} 
    module TestModule where 

    import Database.MongoDB (Action, Document, Document, Value, access, 
           close, connect, delete, exclude, find, 
           host, insertMany, master, project, rest, 
           select, sort, (=:)) 

    main :: IO() 
    main = do 
     wetterDaten <- getWetterDaten 
     pipe  <- connect (host "127.0.0.1") 
     e   <- access pipe master "wetter2017" run 
     close pipe 
     print e 

    --run :: Action IO() 
    run = do 
     clearData 
     insertData 
     return() 

    clearData :: Action IO() 
    clearData = delete (select [] "daten") 

    --insertData :: Action IO [Value] 
    insertData = do 
    **insertMany "daten" testDaten** 

    insertData2 :: Action IO [Value] 
    insertData2 = do 
    **insertMany "daten" getWetterDaten** 

    testDaten = [["data" =: "Zeile0"],["data" =: "Zeile1"], 
       ["data" =: "Zeile2"],["data" =: "Zeile3"]] 

    getWetterDaten = do 
    fileContents <- fmap lines $ readFile "data.txt" 
    let wetterDaten = map makeMongo fileContents 
    return wetterDaten 

    makeMongo x = [ "data"  =: x] 
+0

2番目のエラーは簡単です - あなたのインポートリストに 'Field'を追加します。最初は完全なエラーではありません(ghcは非常に大きなエラーを表示しますが、実際にすべてを読むと非常に正確で有益です)ので、どこから来たのかは分かりませんが、 'lift getWetterDaten >> = insertMany" daten "のようなものが必要です。もちろん、これは 'insert'を実行するたびにファイルを読み込みます。おそらくあなたが望むものではありません。 – user2407038

+0

ありがとうございましたliftM getWetterDaten >> = insertMany "daten3"を試しましたが、エラーが発生しました:予想される型 'Control.Monad.Trans.Reader.ReaderTと一致しませんでした Database.MongoDB.Query.MongoContext IO [Document]' 実際のタイプ 'm0 a10 - > m0 r0' 考えられる原因: 'liftM'はあまりにも少ない引数に適用されます '(>> =)'の最初の引数、つまり 'liftM getWetterDaten – Ralli

答えて

0

私はinsertData2にパラメータとしてデータを渡すことによって機能するソリューションを見つけました:

{-# LANGUAGE OverloadedStrings #-} 
    {-# LANGUAGE ExtendedDefaultRules #-} 
    module TestModule2 where 

    import Database.MongoDB (Action, Document, Document, Value, access, 
           close, connect, delete, exclude, find, 
           host, insertMany, master, project, rest, 
           select, sort, (=:)) 

    main :: IO() 
    main = do 
     wetterDaten <- getWetterDaten 
     processMongo wetterDaten 
     return() 

    processMongo :: [Document] -> IO()  
    processMongo wetterDaten = do 
     pipe  <- connect (host "127.0.0.1") 
     e   <- access pipe master "wetter2017" (run wetterDaten) 
     close pipe 
     print e 

    run :: [Document] -> Action IO() 
    run wetterDaten = do 
     clearData 
     insertData 
     clearData2 
     insertData2 wetterDaten 
     return() 

    clearData :: Action IO() 
    clearData = delete (select [] "daten") 

    clearData2 :: Action IO() 
    clearData2 = delete (select [] "daten2") 

    insertData :: Action IO [Value] 
    insertData = do 
    insertMany "daten" testDaten 

    insertData2 :: [Document] -> Action IO [Value] 
    insertData2 wetterDaten = do 
    insertMany "daten2" wetterDaten 

    testDaten :: [Document] 
    testDaten = [["data" =: "Zeile0"],["data" =: "Zeile1"], 
       ["data" =: "Zeile2"],["data" =: "Zeile3"]] 

    getWetterDaten :: IO [Document] 
    getWetterDaten = do 
    fileContents <- fmap lines $ readFile "data.txt" 
    let wetterDaten = map makeMongo fileContents 
    return wetterDaten 

    makeMongo :: String -> Document 
    makeMongo x = [ "data"  =: x] 
関連する問題