{-# LANGUAGE TypeSynonymInstances #-} {-# LANGUAGE FunctionalDependencies #-} {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE MultiParamTypeClasses #-} {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE TemplateHaskell #-} {-# LANGUAGE DeriveDataTypeable #-} {-# LANGUAGE UndecidableInstances #-} import Data.UString hiding (find, sort, putStrLn) import Database.MongoDB.Connection import Data.Maybe (fromJust) import Control.Monad (forM_) import Control.Monad.Trans (liftIO) import Data.Typeable import Data.Bson import Database.MongoDB.Structured import Database.MongoDB.Structured.Deriving.TH import Database.MongoDB.Structured.Query data Address = Address { addrId :: SObjId , streetNr :: Int , streetName :: String } deriving (Show, Read, Eq, Ord, Typeable) $(deriveStructured ''Address) data User = User { userId :: SObjId , firstName :: String , lastName :: String , favNr :: Int , addr :: Address } deriving(Show, Read, Eq, Ord, Typeable) $(deriveStructured ''User) insertUsers = insertMany [ User { userId = noSObjId , firstName = "deian" , lastName = "stefan" , favNr = 3 , addr = Address { addrId = noSObjId , streetNr = 123 , streetName = "Mission" } } , User { userId = noSObjId , firstName = "amit" , lastName = "levy" , favNr = 42 , addr = Address { addrId = noSObjId , streetNr = 42 , streetName = "Market" } } , User { userId = noSObjId , firstName = "david" , lastName = "mazieres" , favNr = 1337 , addr = Address { addrId = noSObjId , streetNr = 821 , streetName = "Valencia" } } ] run = do delete (select ( (.*) :: QueryExp User)) insertUsers let query = (select (Addr .! StreetNr .== 123 .|| FavNr .>= 3)) { limit = 2 , sort = [asc FirstName] , skip = 0 } liftIO $ print query users <- find query >>= rest liftIO $ printFunc users where printFunc users = forM_ users $ \u -> putStrLn . show $ (fromJust $ u :: User) main = do pipe <- runIOE $ connect (host "127.0.0.1") e <- access pipe master "auth" run close pipe print e