我试图查询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/