Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb 如何使用Haskell从一个数据库移动到另一个数据库?_Mongodb_Haskell_<img Src="//i.stack.imgur.com/RUiNP.png" Height="16" Width="18" Alt="" Class="sponsor Tag Img">elasticsearch_Io_Functional Programming - Fatal编程技术网 elasticsearch,io,functional-programming,Mongodb,Haskell,elasticsearch,Io,Functional Programming" /> elasticsearch,io,functional-programming,Mongodb,Haskell,elasticsearch,Io,Functional Programming" />

Mongodb 如何使用Haskell从一个数据库移动到另一个数据库?

Mongodb 如何使用Haskell从一个数据库移动到另一个数据库?,mongodb,haskell,elasticsearch,io,functional-programming,Mongodb,Haskell,elasticsearch,Io,Functional Programming,我对哈斯凯尔是相当陌生的;我已经阅读了无数的教程和其他相关资源,但每当我决定尝试编写做任何远程有用的事情的程序时,我通常都不知道从哪里开始。我最近在听一个播客,Gabriel Gonzalez谈到保持动力的最佳方式是将其用于项目并开始写作,所以我真的很想将其用于手头的任务 所以,我有一个Mongo数据库,它不断地更新,定期刮取项目,还有一个Elasticsearch数据库。前者将经常使用我之前已经收集的项目进行更新,而后者则使用独特的项目进行填充。为了实现这一点,我有一个脚本(1000行Node

我对哈斯凯尔是相当陌生的;我已经阅读了无数的教程和其他相关资源,但每当我决定尝试编写做任何远程有用的事情的程序时,我通常都不知道从哪里开始。我最近在听一个播客,Gabriel Gonzalez谈到保持动力的最佳方式是将其用于项目并开始写作,所以我真的很想将其用于手头的任务

所以,我有一个Mongo数据库,它不断地更新,定期刮取项目,还有一个Elasticsearch数据库。前者将经常使用我之前已经收集的项目进行更新,而后者则使用独特的项目进行填充。为了实现这一点,我有一个脚本(1000行Node.js),它不断地一个接一个地运行和使用Mongo数据库中的项目,做一些检查,看看它是否已经在Elasticsearch数据库中,如果没有,就添加它;之后,它从Mongo中删除。然而,这个脚本完全是一团糟

我一直想在Haskell中实现这一点,因为Haskell非常适合以一种受控的方式管理IO,因为我读过和听到过,而且我喜欢将用于转换数据的纯函数与实际执行IO的程序部分分开的想法。我还假设一个可行的Haskell解决方案将更加简洁,并且在以后更改内容时更易于推理

到目前为止,我已经按照教程使用mongoDB包在Mongo中执行CRUD操作,但是关于它的工作原理,我仍然有很多不了解的地方。我发现在Elasticsearch中,使用猎犬软件包做同样的事情会更加困难,而且我完全不知道如何将事情组合在一起,特别是在确保相关项目只有在成功添加到Elasticsearch后才能从Mongo中删除的情况下

我知道这是一个非常广泛的问题,但如果有人知道这方面的任何事情,或者只是能够给我一些指导,我将不胜感激。事实上,我们非常感谢您的帮助

我喜欢保留用于转换数据的纯函数的想法 程序中执行IO的部分是分开的

如果您是从Haskell开始的,我建议您将此问题放在次要位置,只需构建一个即使到处都有
IO
的解决方案即可。当您获得信心时,您将学会如何重新构造代码

我完全搞不懂如何把东西拼凑起来, 尤其是在确保只删除相关项目的情况下 成功添加到Elasticsearch后从Mongo开始

除非我遗漏了一些东西,否则这似乎是非常简单的程序逻辑

如果你有以下(完全虚构的,大大简化的)功能

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)
loader::MongoConnection->ElasticConnection->IO r--永远运行
装载机mongoConn elasticConn=永久(do

记录此问题太广泛,无法通过堆栈溢出格式以有用的方式回答。您可能会在这里获得更好的结果,方法是将您目前难以实现的内容提取到一个小的、自包含的代码段中,然后询问有关此问题的问题。谢谢,这是一个很好的答案。正如您在en中指出的d、 更新Elasticsearch更新失败时该怎么办是我需要弄清楚的事情之一。我来自Python,您描述它的方式异常处理听起来与Python中的处理方式类似,我认为Haskell中没有这种情况。另外,当以您描述的方式永远运行它时,它如何处理等待w当Mongo数据库是空的并且没有任何东西可以使用时?@Nicholas Tidemann Haskell有两种发送错误信号的方式:异常和总和类型,如
或者
或者
可能
。至于等待,您可以使用
线程延迟::Int->IO()实现一种简单的轮询机制
来自
Control.Concurrent
。对,我至少对
或者
或者
或者
都很熟悉,因为我已经读了很多关于它们的书,我会看看我是否能解决它们。至于等待,我也找到了
线程延迟
是首选的方式,工作方式类似于Python中的
时间。睡眠
,但是因为它是我想它的工作原理有点不同。我会看看我是否能取得任何进展,谢谢你的帮助。看来你已经证明了我对这个问题的评论是错误的。这是一个很好的、感性的回答。