Nic*_*ann 3 io haskell functional-programming mongodb elasticsearch
我是Haskell的新手; 我已经阅读了无数的教程和其他资源,但每当我决定尝试编写远程有用的程序时,我通常都不知道从哪里开始.我最近在播放一个播客,Gabriel Gonzalez谈到了保持动力的最佳方式是如何将它用于项目并且只是写作,所以我真的想用它来完成我手边的任务.
所以,我有一个Mongo数据库,它不断更新定期抓取的项目,以及一个Elasticsearch数据库.前者经常会更新我之前已经删除的项目,而后者则填充了独特的项目.为了达到这个目的,我有一个脚本(1000行Node.js),它一直在运行并逐个消耗Mongo数据库中的项目,进行一些检查以查看它是否已经存在于Elasticsearch数据库中,如果不是,则添加它; 之后,它从Mongo中删除了.然而,这个脚本完全混乱.
我一直想在Haskell中做这件事,因为Haskell非常适合以我自己读过和听过的方式来控制IO,因为我喜欢保持纯函数来转换数据和部分程序实际执行IO分离.我还假设一个有效的Haskell解决方案会更简洁,并且在以后更改内容时更容易推理.
到目前为止,我已经设法使用mongoDB包来按照教程在Mongo中进行CRUD操作,但是仍然有很多我不了解它的工作方式.我发现使用Bloodhound包更难以在Elasticsearch中做同样的事情,我完全不知道如何将事情拼凑在一起,特别是在确保相关项目仅在成功添加后从Mongo中删除时到Elasticsearch.
我知道这是一个非常广泛的问题,但如果有人对此有所了解,或者只是能够给我一些指导,我将不胜感激.事实上,非常感谢所有的帮助.
我喜欢保持纯函数来转换数据和实际执行IO的程序部分的想法.
如果你从Haskell开始,我会建议你把它留在后面,只需构建一个即使它IO无处不在的解决方案.当您获得信心时,您将学习如何重新构建代码.
我完全不知道如何将事情拼凑在一起,特别是在确保相关项目仅在成功添加到Elasticsearch之后从Mongo中删除时.
除非我缺少某些东西,否则这似乎是非常简单的程序逻辑!
如果您具有以下(完全发明的,非常简化的)功能
getDocumentFromMongo :: MongoGonnection -> IO Document
deleteFromMongo :: MongoConnection -> Document -> IO ()
isPresentInElastic :: ElasticConnection -> Document -> IO Bool
insertInElastic :: ElasticConnection -> Document -> IO ()
Run Code Online (Sandbox Code Playgroud)
你可以写一个无限循环,如:
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)
Run Code Online (Sandbox Code Playgroud)
当然,还有更多的事情需要考虑.做什么,如果一个例外是,而在弹性搜索将抛出?你会大概需要使用的功能,如try,bracket,finally并onException从Control.Exception.
| 归档时间: |
|
| 查看次数: |
144 次 |
| 最近记录: |