我试图查询MongoDB实例以返回一个点。基本上是一个占位符,只是一个基本的数据类型,因为我正在努力学习是的。下面是我给处理者的路线。如何通过id(或其他过滤器)查询数据库并将信息作为json返回?

{-# LANGUAGE EmptyDataDecls    #-}
{-# LANGUAGE FlexibleContexts  #-}
{-# LANGUAGE GADTs             #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE QuasiQuotes       #-}
{-# LANGUAGE TemplateHaskell   #-}
{-# LANGUAGE TypeFamilies      #-}
{-# LANGUAGE RecordWildCards   #-}
{-# LANGUAGE DeriveGeneric     #-}

module Handler.Points where

import Import

mkPersist sqlSettings [persistLowerCase|
Point
    name String
    deriving Show
|]

$(deriveToJSON defaultOptions ''PointGeneric)

getPointsR :: String -> Handler Value
getPointsR pId = do
    pts <- runDB $ selectList [PointName ==. pId] []
    returnJson (pts :: [Entity Point])

这是我收到的错误信息。
Handler\Points.hs:25:20:
    Couldn't match type `Database.Persist.MongoDB.MongoBackend'
                   with `persistent-1.2.3.0:Database.Persist.Sql.Types.SqlBackend'
    In the second argument of `($)', namely
      `selectList [PointName ==. pId] []'
    In a stmt of a 'do' block:
      pts <- runDB $ selectList [PointName ==. pId] []
    In the expression:
      do { pts <- runDB $ selectList [PointName ==. pId] [];
           returnJson (pts :: [Entity Point]) }
Build failure, pausing...

最佳答案

returnJson期望提供一个纯值,但您提供了一个生成纯值的操作。您可以使用do-符号拖出纯值,然后使用returnJson

do
    x <- runDB $ selectFirst [ PointId ==. pId ] []
    returnJson x

或者,您可以使用一元绑定运算符(do符号只是sugar for):
runDB (selectFirst [PointId ==. pId] []) >>= returnJson

这可能会暴露出其他问题,但在此步骤之后,您至少应该会收到不同的错误消息。

关于json - Yesod Mongo DB和JSON,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18808393/

10-09 20:15