2016-11-06 5 views
2

私はかなりハスケルに新しいです。私は数多くのチュートリアルやその他のリソースを読んだことがありますが、リモートで何かをやっているプログラムを書こうとすると、いつどこで始めるべきか分かりません。私は最近、Gabriel Gonzalezが動機づけを維持する最善の方法が実際にプロジェクトに使用して執筆するのを話したポッドキャストを聞いていたので、私が手にしているタスクに本当に使用したいと思っています。Haskellを使用してデータベース間を移動するにはどうすればよいですか?

私はアイテムが定期的に掻き集められるように絶えず更新されているMongoデータベースと、Elasticsearchデータベースを持っています。前者は私が以前に掻き取ったアイテムで頻繁に更新され、後者はユニークなアイテムで埋められます。これを達成するために、私はスクリプト(1000行のNode.js)を持っています。このスクリプトはMongoデータベースのアイテムを1つずつ実行しています。すでにElasticsearchデータベースに入っているかどうかを確認し、そうでない場合は追加します;その後、それはMongoから削除されます。しかし、このスクリプトは完全な混乱です。

私はハスケルでこれをやりたいと思っています。ハスケルは私が読んだことや聞いたことから制御された方法でIOを管理するのに最適で、データ変換のための純粋な機能を保つという考えが好きです。実際にIOを実行するプログラムの部分は別個になります。私はまた、動作しているHaskellのソリューションがより簡潔になり、後で変更するときに理由を付けるのが簡単だと考えています。

これまでのところ、私はmongoDBパッケージを使ってMongoでチュートリアルを実行することでCRUD操作を行ってきましたが、それがどのように機能するのか分かりません。私はElasticsearchで同じことをするためのbloodhoundパッケージを扱うのが難しいと思っています。そして、私は一緒に物事を一緒にする方法について完全に困惑しています。特に、関連項目は正常に追加された後Mongoから削除される弾性検索に。

これは非常に広い質問ですが、誰かがこれについて何かを知っていたり、単に私にある方向性を与えることができれば、私はそれを感謝します。実際、すべての助けは非常に高く評価されるでしょう。

+0

この質問は、あまりにも広範であり、有用な方法でスタックオーバーフロー形式で答えることはできません。現時点で達成するのが難しいことを小さな自己完結型のコードに掘り下げ、それについて質問をすることで、ここでより良い結果が得られるでしょう。 – duplode

答えて

5

私はデータ と実際にIOを分けて実行する部分を変換する純粋な機能を保つという考えが好きです。

ハスケルから始める場合は、これをバックバーナーに残して、どこにでもIOがあっても機能するソリューションを構築することをお勧めします。あなたが自信を持っていくにつれて、コードを再構成する方法を学ぶことになります。

私は完全に成功しElasticsearchに追加された後、モンゴから関連する項目のみが削除されますことを を確保しながら、私は特に、一緒に を物事をつなぎだろうかへと困惑。

私には分かりませんが、かなり単純なプログラムロジックのようです。あなたは、以下の(完全に発明し、肉眼的に簡略化)している場合は

getDocumentFromMongo :: MongoGonnection -> IO Document 

deleteFromMongo :: MongoConnection -> Document -> IO() 

isPresentInElastic :: ElasticConnection -> Document -> IO Bool 

insertInElastic :: ElasticConnection -> Document -> IO() 

はあなたのような無限ループ書くことができる機能:もちろん

loader :: MongoConnection -> ElasticConnection -> IO r -- runs forever 
loader mongoConn elasticConn = forever (do 
    document <- getDocumentFromMongo mongoConn 
    existsInElastic <- isPresentInElastic elasticConn document 
    if existsInElastic 
     then return() 
     else insertInElastic elasticConn document 
    deleteFromMongo mongoConn document) 

を、考慮すべき多くのものがあります。 Elastic Searchに挿入中にexceptionがスローされた場合の対処方法おそらく、try,bracket,finallyonExceptionControl.Exceptionなどの関数を使用する必要があります。

また、おそらくいくつかのレベルの並行性が望まれます。これにはmanygoodlibrariesもあります。

+0

ありがとう、これは素晴らしい答えです。最後に指摘したように、Elasticsearch更新の更新時に何をすべきかは、私が把握する必要があるものの1つです。私はPythonから来ています。あなたがそれを記述する方法は、例外ハンドリングがPythonでどのように行われたかに似ています。私はHaskellのケースではなかったと思います。 また、説明した方法で永遠に実行している場合、Mongoデータベースが空で消費するものがない場合の待機をどのように処理しますか? –

+0

@Nicholas Tidemann Haskellには、例外や、「Either」や「Maybe」のような合計型の2種類があります。 http://book.realworldhaskell.org/read/error-handling.html待機に関しては、 'Control.Concurrent'の' threadDelay :: Int - > IO() 'を使って簡単なポーリングメカニズムを実装することができます。 http://hackage.haskell.org/package/base-4.9.0.0/docs/Control-Concurrent.html#v:threadDelay – danidiaz

+0

右、私は少なくとも「どちらか」と「たぶん」の両方をよく知っています彼らについてはたくさんのことがあり、私はそれを解決することができるかどうかを見ていきます。待ち受けに関しては、 'threadDelay'がPythonの' time.sleep'と同じように動作するようになっていますが、同時であるため、少し違って動作すると思います。私は何か進歩を遂げることができるかどうかを見て、助けてくれてありがとう。 –

関連する問題