YesSOD/Persistent的MongoDB示例

YesSOD/Persistent的MongoDB示例,mongodb,haskell,persistent,yesod,Mongodb,Haskell,Persistent,Yesod,Haskell和Yesod是这里的新手。我一直在尝试遵循Yesod书中持续章节中的与Yesod集成的示例(http://www.yesodweb.com/book/persistent). Sqlite编译和运行似乎很好。然而,我正在尝试使用MongDB,并且很难让它正常工作。具体而言: 在sqlite的示例中: share[mkPersist sqlSettings,mkMigrate“migrateAll”][persist | Yesod的书上说“Mongo代码将使用mongoSetti

Haskell和Yesod是这里的新手。我一直在尝试遵循Yesod书中持续章节中的与Yesod集成的示例(http://www.yesodweb.com/book/persistent). Sqlite编译和运行似乎很好。然而,我正在尝试使用MongDB,并且很难让它正常工作。具体而言:

  • 在sqlite的示例中:

    share[mkPersist sqlSettings,mkMigrate“migrateAll”][persist |

    Yesod的书上说“Mongo代码将使用
    mongoSettings
    ”。但我在任何模块中都找不到它,代码也无法编译。因此,我不得不使用它而不是
    mongoSettings

    MkPersistSettings{mpsBackend=ConT''Action}

    我必须导入Language.Haskell.TH.Syntax来编译它,我假设它应该对用户隐藏,所以我肯定做得不对

    另外,我发现在Mongo的持久性测试中没有“共享”和“迁移”部分。我不知道为什么,我猜这是因为MongoDB没有模式,不需要迁移

  • SqlPersist

    我原以为
    MongoPersist
    会与SqlPersist相对应,我猜几乎是这样——我在persist的测试目录init.hs中找到了
    MongoPersist
    的一个实例。但是它被注释掉了,所以我觉得它过时了?否则就我所知,它没有定义。所以我不知道如何使用c转换以下行(Yesod书第115页,或接近结尾)为MongoDB工作:

    instance YesodPersist PersistTest where
        type YesodPersistBackend PersistTest = SqlPersist
        runDB action = do
            PersistTest pool <- getYesod
            runSqlPool action pool
    
    实例YesDopTest,其中
    类型YesodPersistBackend PersistTest=SqlPersist
    runDB action=do
    持久化测试池(t0->M0B0)->访问模式
    实际类型:M0T0->(t0->M0B0)->M0B0
    等等。到了这个阶段,我对单子的粗略了解还不足以理解这个


    总而言之,我很难将与Yesod的集成示例从Sqlite转换为MongoDB。有人能为我提供一个与MongoDB的Yesod/Persistent的具体示例吗?非常感谢。我今天在Github Yesod Cookbook中添加了一个页面,该页面将MongoDB与Persiste结合使用但是,它没有在MongoDBConn中使用
    ,也没有避免使用TH。另外,我在这里解释了为什么我使用单独的YAML配置文件。链接:

    我知道这是对一个老问题的回答,但是这里有一个独立的方法来获得MongoDB的持久性。这可能对其他新加入持久性的人有用

    {-# LANGUAGE TemplateHaskell #-}
    
    import Database.Persist 
    import Database.Persist.TH
    import Database.Persist.MongoDB
    import Network (PortID (PortNumber))
    
    let mongoSettings = (mkPersistSettings (ConT ''MongoBackend)) {mpsGeneric = False}
        in share [mkPersist mongoSettings] [persistLowerCase|
    Person
        name String
        age Int Maybe
        deriving Show
    BlogPost
        title String
        authorId PersonId
        deriving Show
    |]
    runDBActions actions = 
        withMongoDBConn "myDatabaseName" "localhost" (PortNumber 27017) Nothing 2000 $ \pool ->    
            runMongoDBPool master actions pool
    
    actions = do
        mkey <- insert $ Person "John Doe" $ Just 35
        ...
    
    main :: IO ()
    main = do
        runDBactions actions
    
    {-#语言模板haskell}
    导入数据库。持久化
    导入Database.Persist.TH
    导入Database.Persist.MongoDB
    导入网络(PortID(PortNumber))
    让mongoSettings=(mkPersistSettings(ConT'MongoBackend)){mpsGeneric=False}
    共享[mkPersist mongoSettings][persist小写|
    人
    名称字符串
    也许是年龄
    衍生节目
    博客帖子
    标题字符串
    作者人格
    衍生节目
    |]
    runDBActions操作=
    使用MongoDBCONN“myDatabaseName”“localhost”(端口号27017)无任何2000$\pool->
    runMongoDBPool主操作池
    动作=做
    
    mkey您可以使用
    yesod init
    scaffolding工具,生成一个MongoDB站点并查看其配置情况。很难从您如何解释您的情况中准确判断缺少哪些部分。感谢您的建议。查看这一点会有所帮助…尽管大部分代码都在目录树中太复杂了,我无法弄清楚到底发生了什么。我将编辑原始帖子以澄清问题。对于最新的持久化mongodb 2.x,应使用以下方法修复此示例:let mongoSettings=(mkPersistSettings(ConT'MongoContext)){mpsGeneric=False}“MongoBackend”改为“MongoContext”
    main :: IO()
    main = withMongoDBConn ":memory:" $ runMongoDBConn $ do
        runMigration migrateAll 
        johnId <- insert $ Person "John Doe" $ Just 35
        ... and so on          
    
    {-# LANGUAGE TemplateHaskell #-}
    
    import Database.Persist 
    import Database.Persist.TH
    import Database.Persist.MongoDB
    import Network (PortID (PortNumber))
    
    let mongoSettings = (mkPersistSettings (ConT ''MongoBackend)) {mpsGeneric = False}
        in share [mkPersist mongoSettings] [persistLowerCase|
    Person
        name String
        age Int Maybe
        deriving Show
    BlogPost
        title String
        authorId PersonId
        deriving Show
    |]
    runDBActions actions = 
        withMongoDBConn "myDatabaseName" "localhost" (PortNumber 27017) Nothing 2000 $ \pool ->    
            runMongoDBPool master actions pool
    
    actions = do
        mkey <- insert $ Person "John Doe" $ Just 35
        ...
    
    main :: IO ()
    main = do
        runDBactions actions